Delphi-int.ru: портал программистов

Вход Регистрация | Забыли пароль?

События

Сегодня:
Вопросы0    Ответы0    Мини-форумы0


Последние:
Вопрос09.08, 09:39 / #6696
Ответ29.03, 23:32 / #6682
Новости8 июля 2023


Сейчас онлайн:
На сайте — 25
На IRC-канале — 2

Ссылки

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

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

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);

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

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

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

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

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

type 
  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;

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. Он очень прост. Перемещение мыши с нажатой левой кнопкой обеспечивает выделение прямоугольного фрагмента. Такую функцию вы можете наблюдать в любом графическом редакторе, а исходный код проекта использовать в собственных разработках.

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.

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

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

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

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

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

Программа-пример к статье »

Статья добавлена: 16 марта 2007

Следующая статья: Защита формы паролем »

Рейтинг статьи: 5.00 Голосов: 1 Ваша оценка:

Зарегистрируйтесь/авторизируйтесь,
чтобы оценивать статьи.

Для вставки ссылки на данную статью на другом сайте используйте следующий HTML-код:

Ссылка для форумов (BBCode):

Быстрая вставка ссылки на статью в сообщениях на сайте:
{{a:31}} (буква a — латинская) — только адрес статьи (URL);
{{статья:31}} — полноценная HTML-ссылка на статью (текст ссылки — название статьи).

Поделитесь ссылкой в социальных сетях:


Комментарии читателей к данной статье

koctja
Репутация: нет

koctja (15 июня 2013, 17:09):

Очень хорошая статья о управлении мышкой, надо попробовать сделать на данных примерах, а то работать с ней бывает трудно, может это улучшит эту работу.
processor
Репутация: нет

processor (16 августа 2011, 11:52):

Вообще желательно бы код без ошибок приводить ставить кавычки и единички где надо , а то новичек ведь заклебется разбираться почему не работает. И даже после исправления всех ошибок - не работает и все тут , какие-то исключения возникают )))

Оставлять комментарии к статьям могут только зарегистрированные пользователи.