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

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

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

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

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) предназначены три метода обработчика, реагирующие на прокрутку:

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

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

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

В 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.

 


Знаете ли Вы, что релятивистское объяснение феномену CMB (космическому микроволновому излучению) придумал человек выдающейся фантазии Иосиф Шкловский (помните книжку миллионного тиража "Вселенная, жизнь, разум"?). Он выдвинул совершенно абсурдную идею, заключавшуюся в том, что это есть "реликтовое" излучение, оставшееся после "Большого Взрыва", то есть от момента "рождения" Вселенной. Хотя из простой логики следует, что Вселенная есть всё, а значит, у нее нет ни начала, ни конца... Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution