|
Управление мышью
Каждый элемент управления обладает
набором свойств и методов, обеспечивающих управление
мышью. Понятно, что это важный и нужный механизм. Рассмотрим
кратко его устройство.
Воздействие мышью на интерфейсные элементы
приложения разработчик может отслеживать при помощи
целой группы методов-обработчиков.
На нажатие кнопки мыши реагирует метод
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 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;
|
|
Задает число прокручиваемых
линий
|
Листинг 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.
|