Форум: "Основная";
Текущий архив: 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.004 c