Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.02;
Скачать: CL | DM;

Вниз

Как обрабатывать WM_MOUSEMОVE для контрола   Найти похожие ветки 

 
i-s-v ©   (2005-08-05 18:43) [0]

Например, для кнопки.
Вообще-то надо отрисовать кнопку в "горячем" состоянии.


 
Eraser ©   (2005-08-05 21:54) [1]

i-s-v ©   (05.08.05 18:43)
Вообще-то надо отрисовать кнопку в "горячем" состоянии.


Для этого нужно перехватывать сообщение CM_MOUSEENTER и CM_MOUSELEAVE для обратного эффекта.

Все потомки TComponent могут посылать сообщения CM_MOUSEENTER и CM_MOUSELEAVE во время вхождения и покидания курсора мыши области компонента. Если вам необходимо, чтобы ваши компоненты обладали реакцией на эти события, необходио написать для них соответствующие обработчики.

procedure CMMouseEnter(var msg:TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
..
..
..
procedure MyComponent.CMMouseEnter(var msg:TMessage);
begin

inherited;
{действия на вход мыши в область компонента}
end;

procedure MyComponent.CMMouseLeave(var msg: TMessage);
begin

inherited;
{действия на покидание мыши области компонента}
end;  

Дополнение

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

MouseEnter - когда событие мыши входит в пределы визуального компонента;
MouseLeave - когда событие мыши оставляет его пределы.
Известно, что все Delphi объявляет эти сообщения в виде:
Cm_MouseEnter;
Cm_MouseLeave.
Т.е. все визуальные компоненты, которые порождены от TControl, могут отлавливать эти события. Следующий пример показывает как создать наследника от TLabel и добавить два необходимых события OnMouseLeave и OnMouseEnter.

(*///////////////////////////////////////////////////////*)
(*// Author: Briculski Serge
(*// E-Mail: bserge@airport.md
(*// Date: 26 Apr 2000
(*///////////////////////////////////////////////////////*)

unit BS_Label;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TBS_Label = class(TLabel)
 private
   { Private declarations }
   FOnMouseLeave: TNotifyEvent;
   FOnMouseEnter: TNotifyEvent;
   procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
   procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
 protected
   { Protected declarations }
 public
   { Public declarations }
 published
   { Published declarations }
   property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
   property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("Custom", [TBS_Label]);
end;

{ TBS_Label }

procedure TBS_Label.CMMouseEnter(var Message: TMessage);
begin
 if Assigned(FOnMouseEnter) then
   FOnMouseEnter(Self);
end;

procedure TBS_Label.CMMouseLeave(var Message: TMessage);
begin
 if Assigned(FOnMouseLeave) then
   FOnMouseLeave(Self);
end;

end.


 
i-s-v ©   (2005-08-06 13:20) [2]

Чуть не то...
В смысле для контрола на WinAPI... Без VCL...


 
Eraser ©   (2005-08-06 13:32) [3]

i-s-v ©   (06.08.05 13:20) [2]

А разницы-то?! Главное тут обрабатывать CM_MOUSEENTER и CM_MOUSELEAVE.


 
i-s-v ©   (2005-08-06 15:35) [4]

Я чего-то не догоняю.. Неужели настолько тупой?..
Программа написана на чистом WinAPI без использования VCL, а CM_MOUSEENTER объявлен в Controls.

Создаю главное окно. Создаю button c WS_CHILD or bS_OWNERDRAW.
B WM_DRAWITEM отрисовываю 2 состояния: обычное и нажатое.
Хотелось бы отрисовать еще и третье, горячее..
Пытался в WM_MOUSEMOVE отследить, когда курсор находит на кнопку - не получается: после того, как курсор находит на эту самую кнопку, сообщение WM_MOUSEMOVE гланому окну не передается...
Пробовал при создании главного окна вызывать SetCapture - все-равно, как только курсор находит на кнопку, WM_MOUSEMOVE не передается...


 
Eraser ©   (2005-08-06 16:54) [5]

i-s-v ©   (06.08.05 15:35) [4]

А где происходит обработка WM_MOUSEMOVE? В оконной процедуре или в цикле обработки сообщений потока?


 
i-s-v ©   (2005-08-06 17:25) [6]

В оконной процедуре.. А надо в цикле?..


 
Eraser ©   (2005-08-06 20:34) [7]

i-s-v ©   (06.08.05 17:25) [6]

Да возможно, т.к. сообщение WM_MOUSEMOVE отправляется через PostMessage и является асинхронным.



Страницы: 1 вся ветка

Текущий архив: 2005.10.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
3-1124255979
Zaero
2005-08-17 09:19
2005.10.02
Rave Report: Смена набора символов в шрифте элемента "Text".


1-1126602981
matroskin
2005-09-13 13:16
2005.10.02
Dll


4-1123180625
Андрей Молчанов
2005-08-04 22:37
2005.10.02
Получить идентификатор Вся Сеть


14-1126679907
boriskb
2005-09-14 10:38
2005.10.02
Как вам украшения? :)


14-1125986780
Igorek
2005-09-06 10:06
2005.10.02
За что мы любим США