netlib.narod.ru< Назад | Оглавление | Далее >

Клавиатурный интерфейс для программы SysInfo

Полагаю, вы помните программы-примеры из главы 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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz