Класс TWinControl. Реакция на события от мыши и клавиатуры

   
На этом шаге мы продолжим изучение некоторых событий и методов класса
TWinControl.
Полный перечень свойств, методов и событий приведен на шаге 17.
С дополнительной информацией по обработке нажатия кнопок мыши можно
познакомиться
на шагах 5 и 6, а по
обработке нажатия клавиш на клавиатуре
- на шагах 7, 8 и 9.

   
Можно предусмотреть реакцию на нажатие и отпускание кнопок и перемещение
курсора мыши.
Первые два из них имеют формат:

   property OnMouseDown: TMouseEvent; 
   property OnMouseUp: TMouseEvent; 
   TMouseEvent  =  procedure (Sender: TObject; Button: TMouseButton; 
                   Shift: TShiftState; x, y: Integer) of object; .

   
Параметры:

  • Sender - элемент-источник сообщения (обычно равен Self);
  • Button - идентификатор одной из кнопок. TMouseButton = (mbLeft,
    mbRight, mbMiddle);
  • Shift - множество, которое может содержать элементы:
    • ssAlt, ssCtrl, ssShift - в зависимости от состояния этих
      клавиш;
    • ssLeft, ssRight, ssMiddle, ssDouble - в зависимости от
      нажатия кнопок мыши (ssDouble - нажаты и правая, и левая
      кнопки);
    • X, Y - координаты нажатия (в системе координат
      клиентской области получателя).

   
При перемещении мыши возникает событие:

   property OnMouseMove: TMouseMoveEvent; 
   TMouseMoveEvent = procedure (Sender: TObject; Shift: TShiftState;
                            X, Y: Integer) of object;   .

   
Два события извещают о щелчке и двойном щелчке левой кнопкой мыши над
компонентом:

   property OnClick: TNotifyEvent; 
   property OnDblClick: TNotifyEvent;     . 

   
Отменить генерацию этих событий можно, удалив флаг csClickEvents из слова состояния
элемента (ControlStyle). Для некоторых компонентов (например, кнопок)
OnClick возникает еще и при нажатии определенных клавиш на клавиатуре, а также
вследствие вызова метода Click.

   
События, связанные с мышью, могут быть получены потомками TControl.
В отличие
от них, реакцию на события от клавиатуры могут иметь только оконные
элементы управления ("могут",
так как на уровне TControl и TWinControl эти события только
описаны, но
не опубликованы). Таким образом, есть компоненты (в том числе в
Палитре компонентов),
не имеющие связи с этими событиями из-за ее ненадобности.
   
Нажатие и отпускание клавиш клавиатуры могут инициировать следующие
события:

   property OnKeyDown: TKeyEvent; 
   property OnKeyUp: TKeyEvent; 
   TKeyEvent = procedure (Sender: TObject; var Key: Word; 
                        Shift:  TShiftState) of object;  .

   
Генерация этих событий встроена в обработчики сообщений Windows
WM_KEYDOWN, WM_SYSKEYDOWN и
WM_KEYUP, WM_SYSKEYUP соответственно.

   
Обработчику передаются:

  • Sender - источник сообщения;
  • Shift - состояние специальных клавиш и кнопок мыши во время
    нажатия (отпускания);
  • Key - код нажатой клавиши, представляющий собой виртуальный код
    клавиши
    Windows (константы вида VK_XX, например, VK_F1,
    VK_ESCAPE и т. п.).

   
Обратите внимание, что Key является var-параметром; то есть
его значение может
быть изменено программистом.
   
Другое событие, возникающее вследствие нажатия клавиши:

   property OnKeyPress: TKeyPressEvent; 
   TKeyPressEvent = procedure (Sender: TObject; var Key: Char) of object;    .

   
Это событие возникает при вводе с клавиатуры только ASCII-символа.
Таким образом,
оно не генерируется, например, при нажатии функциональных клавиш или
клавиши
Caps Lock. Обработчик события вызывается при нажатии буквенных (в
том числе вместе с
клавишей Shift) клавиш, комбинаций Ctrl+A .. Ctrl+Z (коды
ASCII #1..#26),
клавиш Enter, Esc, Backspace, Ctrl+Break (ее код - #3) и
некоторых других.
Также ASCII-код можно сгенерировать, нажав клавиши
Alt+<десятичный код символа>
на числовой клавиатуре.
   
Событие OnKeyPress соответствует сообщению Windows
WM_CHAR. Все сообщения клавиатуры
поступают тому элементу управления, который в данный момент имеет фокус
ввода. Однако
у этого правила есть одно исключение. Если у формы, которая содержит этот
элемент управления,
свойство

   property KeyPreview: Boolean; 

установлено в True, то сначала все три вида сообщений поступают к ее
обработчикам, и
только потом - к элементу управления. Если при этом в них обнулить параметр
Key, то
в элемент сообщение не поступит вообще. Пусть, например, клавиша
F5 зарезервирована для
изменения состояния формы. Приведем фрагмент кода, реализующий эту
задачу:

procedure  TForml.FormCreate(Sender: TObject); 
begin
   //Установка приоритета формы при обработке событий.
   KeyPreview:= True; 
end;

//Обработчик нажатия клавиши.
procedure TForm1.FormKeyDown(Sender: TObject;  var  Key: Word; 
         Shift: TShiftState); 
begin
   if Key = VK_F5   then  
//Если нажата клавиша F5
   begin
    //и при этом еще и клавиша Ctrl,
    if ssCtrl in Shift  then 
         WindowState := wsNormal//то форма будет нормального размера.
    else
         //В противном случае окно будет развернуто на весь экран.
         if Shift =  [ ]  then WindowState := wsMaximized; 
   end;
   Key:= 0; //Обнуляя параметр, мы запрещаем дальнейшую обработку.
end;

   
На следующем шаге мы продолжим изучение состава класса
TWinControl,
в частности, разберем понятие фокус ввода.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий