Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.088 c
3-1124256782
RomanBishkek
2005-08-17 09:33
2005.10.02
Как можно импортировать данные в SQL Server из Excel


1-1126159000
ArtemB
2005-09-08 09:56
2005.10.02
Chart


1-1126704720
NetFlover
2005-09-14 17:32
2005.10.02
Проиграть по телефону музычку .... :)


1-1126176960
Рафик
2005-09-08 14:56
2005.10.02
ListBox1 - Двойной щелчок


1-1125994707
V.exeR
2005-09-06 12:18
2005.10.02
Программное добавление задач в FlashGet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский