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 | < Назад | Оглавление | Далее > |