| netlib.narod.ru | < Назад | Оглавление | Далее > |
Полагаю, вы помните программы-примеры из главы 4, которые показывали сведения о системе. Последняя из них — SysInfoReflection — была значительно усовершенствована по сравнению с первым «сырым» вариантом, но одна небольшая проблема еще оставалась: у этой программы не было интерфейса, использующего клавиатуру.
Пришло время добавить к ней такой интерфейс, и это еще один пример того, как наследование полностью оправдывает себя. Класс SysInfoKeyboard является производным от SysInfoReflection и включает переопределенный метод OnKeyDown.
SysInfoKeyboard.cs
//------------------------------------------------
// SysInfoKeyboard.cs (C) 2001 by Charles Petzold
//------------------------------------------------
using System;
using System.Drawing;
using System.Windows.Forms;
class SysInfoKeyboard: SysInfoReflection
{
public new static void Main()
{
Application.Run(new SysInfoKeyboard());
}
public SysInfoKeyboard()
{
Text = "System Information: Keyboard";
}
protected override void OnKeyDown(KeyEventArgs kea)
{
Point pt = AutoScrollPosition;
pt.X = -pt.X;
pt.Y = -pt.Y;
switch(kea.KeyCode)
{
case Keys.Right:
if ((kea.Modifiers & Keys.Control) == Keys.Control)
pt.X += ClientSize.Width;
else
pt.X += Font.Height;
break;
case Keys.Left:
if ((kea.Modifiers & Keys.Control) == Keys.Control)
pt.X -= ClientSize.Width;
else
pt.X -= Font.Height;
break;
case Keys.Down: pt.Y += Font.Height; break;
case Keys.Up: pt.Y -= Font.Height; break;
case Keys.PageDown:
pt.Y += Font.Height * (ClientSize.Height / Font.Height);
break;
case Keys.PageUp:
pt.Y -= Font.Height * (ClientSize.Height / Font.Height);
break;
case Keys.Home: pt = Point.Empty; break;
case Keys.End: pt.Y = 1000000; break;
}
AutoScrollPosition = pt;
}
}
Как сказано в главе 4, изменяемое свойство AutoScrollPosition реализовано в объекте ScrollableControl (потомком которого является Form) как средство поддержки автоматической прокрутки. Значением AutoScrollPosition является структура Point, указывающая положение двух полос прокрутки.
При чтении AutoScrollPosition поученные координаты отрицательны и указывают положение виртуальной клиентской области относительно верхнего левого угла физической клиентской области. Однако при установке AutoScrollPosition координаты должны быть положительными. Поэтому в программу добавлены строки:
pt.X = -pt.X; pt.Y = -pt.Y;
А можно и иначе: просто настроить координаты на основе какой-либо клавиши управления курсором. При нажатии левой или правой стрелки одновременно с Ctrl я сдвигаю клиентскую область на ее ширину или, если клавиша Ctrl не нажата, — на величину высоты символа. Действие остальных клавиш управления курсором я сделал независимым от состояния модификаторов. Клавиша Home возвращает курсор в начало списка, End — перемещает его в конец списка, не меняя его положения по горизонтали.
| netlib.narod.ru | < Назад | Оглавление | Далее > |