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

Вниз

Перехват сообщения   Найти похожие ветки 

 
TStas ©   (2005-09-13 22:41) [0]

Положил на форму панель и пытался перехватывать сообщения мыши, чтобы на панеле писались координаты курсора, вне зависимости от того, над формой мышь или над панелью.
Перекрыл WinProc формы:
procedure TForm1.WndProc(var Message: TMessage);
var
 msg:TWMMouse;
 x, y: Integer;
begin
 if Message.Msg = $0200 then
   begin
   msg := TWMMouse(Message);
   x := msg.XPos;
   y := msg.YPos;
   Panel1.Caption:=IntToStr(x)+":"+IntToStr(y)
   end;
 inherited;

end;
Все равно при движении над панелью координаты курсора получить не удается. В чем ошибка?


 
Eraser ©   (2005-09-13 23:00) [1]


> TStas ©   (13.09.05 22:41)

При обявлении WndProc использовал ключевое слово override ?


> Message.Msg = $0200

Лучше испольвать Message.Msg = WM_MOUSEMOVE
Константы не дураки придумали.


 
Eraser ©   (2005-09-13 23:02) [2]


> TStas ©   (13.09.05 22:41)

Да и вообще зачем подменять оконную ф-ю, когда есть куда более "родные" для делфи способы перехвата сообщений.


 
TStas ©   (2005-09-13 23:05) [3]

>Eraser
Конечно написал override. Константа, дело нужное, но я ведь из модуля взял это значение. А более родные, это какие, наприаер?


 
Eraser ©   (2005-09-13 23:12) [4]

> TStas ©   (13.09.05 23:05) [3]
> я ведь из модуля взял это значение


Значения констант для сообщений виндовз врядли конечно менять будут, но вообще частенько от версии к версии значения у некоторых констант меняют.

>  А более родные, это какие, наприаер?

 private
   procedure WMMouseMove(var Msg: TWMMouse); message WM_MOUSEMOVE;
...
procedure TForm1.WMMouseMove(var Msg: TWMMouse);
begin
 {Âàø êîä}
 inherited;
end;


 
TStas ©   (2005-09-13 23:19) [5]

>Eraser
Спасибо за ответ, сейчас попробую, но я все равно не понял, в чем моя ошибка. Это ведь не более, чем опыт, чтобы научиться перехвату


 
TStas ©   (2005-09-13 23:29) [6]

>Eraser Попробовал. Все тоже самое. Над панелью перехват прекращается. Ставил, перед inherited :(


 
Eraser ©   (2005-09-14 00:41) [7]


> TStas ©   (13.09.05 23:29) [6]

Приведеный мной код, а так же ваш код в [0] пердназначен для перехватасообщений формы, а не панели!
Ессено чтобы перехватывать сообщения панели, нужно ставить перехватчики в оконой ф-ии панели,... думал что это само собой разумеется.

Вообще, раз на то пошло, почему бы не использовать обработчик OnMouseMove?


 
Юрий Зотов ©   (2005-09-14 00:49) [8]

> TStas ©   (13.09.05 23:29) [6]

1. Сообщение WM_MOUSEMOVE поступает тому окну, над которым находится мышь, так что результат закономерный.

2. Что мешает использовать для формы и панели общий обработчик события OnMouseMove?


 
wnew ©   (2005-09-14 01:49) [9]

Бросьте на форму компонент ApplicationEvents и создайте обработчик для onMessage:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
 var Handled: Boolean);
var
 Pos: TPoint;
begin
 if Msg.message = WM_MOUSEMOVE then
 begin
   Handled := True;
   Pos := ScreenToClient(Mouse.CursorPos);
   Label1.Caption := IntToStr(Pos.x);
   Label2.Caption := IntToStr(Pos.y);
 end;
end;


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


 
Big Joe ©   (2005-09-14 08:49) [10]

program Project1;

uses
 Forms,
 Unit1 in "UNIT1.PAS" { Form1 },
 Messages, WinTypes, WinProcs,

{$R *.RES}

var
 OldWndProc: TFarProc;

function NewWndProc(hWndAppl: HWnd; Msg, wParam: Word; lParam: Longint):
 Longint; export;
begin
 { default WndProc return value }
 Result := 0;
 { handle messages here; the message number is in Msg }
 Result := CallWindowProc(OldWndProc, hWndAppl, Msg, wParam, lParam);
end;

begin
 Application.CreateForm(TForm1, Form1);
 OldWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC));
 SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc));
 Application.Run;
end.


 
TStas ©   (2005-09-14 20:04) [11]

>Юрий Зотов
То, что цель, научиться перехвату сообщений. Это же упражнение, не более. Задача вылезла при написании компонентов.



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

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

Наверх




Память: 0.49 MB
Время: 0.033 c
6-1117791427
Marabunt
2005-06-03 13:37
2005.10.02
FTP client ошибка команды ChangeDir для indy


14-1125743585
Rouse_
2005-09-03 14:33
2005.10.02
DimonF женится :)


14-1126677712
Аноним
2005-09-14 10:01
2005.10.02
dnsbl.sorbs.net


14-1126214784
partizan
2005-09-09 01:26
2005.10.02
Задачка по теории вероятности


4-1122987724
dest81
2005-08-02 17:02
2005.10.02
Нооk