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

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

{codecitation class=»brush: pascal; gutter: false;» width=»500px»}

type

TMouseEvent = procedure (Sender: TObject;

Button: TMouseButton;

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

property OnMouseDown: TMouseEvent;

 

{/codecitation}

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

{codecitation class=»brush: pascal; gutter: false;» width=»500px»}

type TMouseButton = (mbLeft, mbRight, mbMiddle);

{/codecitation}

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

{codecitation class=»brush: pascal; gutter: false;» width=»500px»}

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

{/codecitation}

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

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

{codecitation class=»brush: pascal; gutter: false;» width=»500px»}

type
TMouseEvent = procedure (Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer) of object;
property OnMouseUp: TMouseEvent;

{/codecitation}

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

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

{codecitation class=»brush: pascal; gutter: false;» width=»500px»}

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

{/codecitation}

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

{codecitation class=»brush: pascal; gutter: false;» width=»500px»}

property OnClick: TNotifyEvent;
property OnDblClick: TNotifyEvent;

{/codecitation}

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

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

{codecitation class=»brush: pascal; gutter: false;» width=»500px»}

property Cursor: TCursor;

{/codecitation}

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

{codecitation class=»brush: pascal; gutter: false;» width=»500px»}

property OnMouseWheel: TMouseWheelEvent;
property OnMouseWheelUp: TMouseWheelUpDownEvent;
property OnMouseWheelDown: TMouseWheelUpDownEvent;

{/codecitation}

OnMouseWheel вызывается при прокрутке вообще, OnMouseWheelUp — при прокрутке вперёд, OnMouseWheelDown — при прокрутке назад.

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

Объявление

Описание

property Capture: HWND;

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

property CursorPos: TPoint;

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

property Draglmmediate: Boolean;

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

property DragThreshold: Integer;

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

property MousePresent: Boolean;

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

type UINT = LongWord; property RegWheelMessage: UINT;

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

property WheelPresent: Boolean;

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

property WheelScrollLines: Integer;

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

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

{codecitation class=»brush: pascal; gutter: false;» width=»500px»}

unit uDemo;

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 := Ширина: ‘ + IntToStr(Abs(MouseRect.Right — MouseRect.Left));
Panels[5].Text := Высота: ‘ + IntToStr(Abs(MouseRect.Bottom — MouseRect.Top));
end; end;

procedure TMainForm.TimerTimer(Sender: TObject);
begin
with StatusBar do
begin
Panels[0].Text := Дата: ‘ + DateToStr(Now); Panels[1].Text := Время: ‘ + TimeToStr(Now);
end;
end;

end.

{/codecitation}

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

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

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

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

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

Добавить комментарий