M Y D E L P H I 7 . R U Самоучитель программирования  
 
  • Главная
  •  

     

    Управление мышью

    Каждый элемент управления обладает набором свойств и методов, обеспечивающих управление мышью. Понятно, что это важный и нужный механизм. Рассмотрим кратко его устройство.

    Воздействие мышью на интерфейсные элементы приложения разработчик может отслеживать при помощи целой группы методов-обработчиков.

    На нажатие кнопки мыши реагирует метод

    type

    TMouseEvent = procedure (Sender: TObject; 

    Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer) of object;

     property OnMouseDown: TMouseEvent;

    В параметре Button передается признак нажатой кнопки:

    type TMouseButton = (mbLeft, mbRight, mbMiddle);

    Параметр shift определяет нажатие дополнительной клавиши на клавиатуре:

    type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);

    Параметры х и у возвращают координаты курсора.

    На отпускание кнопки мыши реагирует метод:

    type

    TMouseEvent = procedure (Sender: TObject;

     Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer) of object; 

    property OnMouseUp: TMouseEvent;

    Его параметры описаны выше.

    При перемещении мыши можно вызывать метод-обработчик

    TMouseMoveEvent = procedure(Sender: TObject;

     Shift: TShiftState; X, Y: Integer) of object;

    property OnMouseMove: TMouseMoveEvent;

    Если у разработчика нет необходимости так подробно отслеживать состояние мыши, можно воспользоваться двумя другими методами:

    property OnClick: TNotifyEvent; 

    property OnDblClick: TNotifyEvent;

    Первый реагирует на щелчок кнопкой, второй — на двойной щелчок.

    Каждый элемент управления может изменять внешний вид указателя мыши, перемещающейся над ним. Для этого используется свойство

    property Cursor: TCursor;

    Для управления дополнительными возможностями мыши для работы в Internet (ScrollMouse) предназначены три метода обработчика, реагирующие на прокрутку:

    •  property OnMouseWheel: TMouseWheelEvent;

     вызывается при прокрутке;

    •  property OnMouseWheelUp: TMouseWheelUpDownEvent;

    вызывается при прокрутке вперед;

    •  property OnMouseWheelDown: TMouseWheelUpDownEvent;

    вызывается при прокрутке назад.

    В VCL имеется класс TMouse, содержащий свойства мыши, установленной на компьютере. Обращаться к экземпляру класса, который создается автоматически, можно при помощи глобальной переменной Mouse. Свойства класса представлены в табл. 27.1.

    В качестве примера обработки управляющих воздействий от мыши рассмотрим пример DemoMouse. Он очень прост. Перемещение мыши с нажатой левой кнопкой обеспечивает выделение прямоугольного фрагмента. Такую функцию вы можете наблюдать в любом графическом редакторе, а исходный код проекта использовать в собственных разработках (листинг 27.2).

    Таблица 27.1. Свойства и методы класса mouse

    Объявление

    Тип

    Описание

    property Capture: HWND;

    Pu

    Дескриптор элемента управления, над которым находится мышь

    property CursorPos: TPoint;

    Pu 

    Содержит координаты указателя мыши

    property Draglmmediate: Boolean;

    Ro

     

    При значении True реакция на нажатие выполняется немедленно

    property DragThreshold: Integer;

    Ro

    Задержка реакции на нажатие

    property MousePresent: Boolean;

    Ro

    Определяет наличие мыши

    type UINT = LongWord; property RegWheelMessage: UINT;

    Ro

    Задает сообщение, посылаемое при прокрутке в ScrollMouse

    property WheelPresent: Boolean;

    Ro

     

    Определяет наличие ScrollMouse

    property WheelScrollLines : Integer;

    Ro

    Задает число прокручиваемых линий

     Листинг 27.2. Модуль главной формы проекта DemoMouse  

    unit Main; 

    interface

    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    ExtCtrls, ComCtrls;

    type

    TMainForm = class(TForm) ColorDlg: TColorDialog; 

    StatusBar: TStatusBar; Timer: TTimer;

     procedure FormMouseDown(Sender: TObject;

     Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

    procedure FormMouseUp(Sender: TObject;

     Button: TMouseButton;

     Shift: TShiftState; X, Y: Integer);

    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

    procedure TimerTimer(Sender: TObject);

     private

    MouseRect: TRect;

    IsDown: Boolean;

    RectColor: TColor;

     public

    { Public declarations }

     end;

    var

    MainForm: TMainForm;

    implementation {$R *.DFM}

    procedure TMainForm.FormMouseDown(Sender: TObject; Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

     begin

    if Button = mbLeft then with MouseRect do

     begin

    IsDown := True; Left := X; Top := Y; Right := X; Bottom := Y;

    Canvas.Pen.Color := RectColor; 

    end;

    if (Button = mbRight) and ColorDlg.Execute then RectColor := ColorDlg.Color;

     end;

    procedure TMainForm.FormMouseUp(Sender: TObject; 

    Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

    begin

    IsDown := False;

    Canvas.Pen.Color := Color;

    with MouseRect do

    Canvas.Polyline([Point(Left, Top), Point(Right, Top), Point(Right,

    Bottom), Point(Left, Bottom), Point(Left, Top)]);

    with StatusBar do

    begin

    Panels[4].Text := ''; Panels [5] .Text := ";

     end;

     end;

    procedure TMainForm.FonnMouseMove(Sender: TObject; Shift: TShiftState; X,

    Y: Integer);

     begin

    with StatusBar do

     begin

    Panels[2].Text := 'X: ' + IntToStr(X);

    Panels[3].Text := 'Y: ' + IntToStr(Y);

     end;

    if Not IsDown then Exit; Canvas.Pen.Color := Color; with mouserect do 

    begin

    Canvas.Polyline([Point(Left, Top), Point(Right, Top),

    Point(Right, Bottom), Point(Left, Bottom), Point(Left, Top)]);

    Right := X;

    Bottom := Y;

    Canvas.Pen.Color := RectColor;

    Canvas.Polyline([Point(Left, Top), Point(Right, Top),

    Point(Right, Bottom), Point(Left, Bottom), Point(Left, Top)]);

     end;

    with StatusBar do begin

    Panels [4] .Text := 'IHwpMHa: ' + IntToStr(Abs(MouseRect.Right - MouseRect.Left));

    Panels[5].Text := 'BacoTa: ' + IntToStr(Abs(MouseRect.Bottom - MouseRect.Top));

    end; end;

    procedure TMainForm.TimerTimer(Sender: TObject); 

    begin

    with StatusBar do 

    begin

    Panels[0].Text := 'flaTa: ' + DateToStr(Now); Panels[1].Text := 'BpeMH: ' + TimeToStr(Now);

     end; 

    end;

    end.

    При нажатии левой кнопки мыши в методе-обработчике FormMouseDown включается режим рисования прямоугольника (isDown := True) и задаются его начальные координаты.

    При перемещении мыши по форме проекта вызывается метод-обработчик FormMouseMove, в котором координаты курсора и размеры прямоугольника передаются на панель состояния. Если левая кнопка мыши нажата (isDown = True), то осуществляется перерисовка прямоугольника.

    При отпускании кнопки мыши в методе FormMouseUp рисование прямоугольника прекращается (isDown := False).

    Если была нажата правая кнопка мыши, то метод-обработчик FormMouseDown обеспечивает отображение диалога выбора цвета, который позволяет сменить цвет линий прямоугольника.

    Метод-обработчик TimerTimer обеспечивает отображение на панели состояния текущей даты и времени.

    Примечание

    Для рисования прямоугольника использовался метод PolyLine, который работает при перемещении курсора влево и вверх относительно начальной точки. Для стирания старого прямоугольника желательно использовать режимы XOR и NOTXOR, которые обеспечивают восстановление рисунка под линией. Подробно об этом см. гл. 10.