Komunikat WM_MOUSEMOVE - Co robię źle?

0

Poniżej prezentuję fragment kodu który ma za zadanie pokazywać gdzie jest obecnie kursor (Oczywiście w obszarze naszej aplikacji). Wszystko było by ok gdyby nie fakt że jak na formie postawię np. Panel to w momencie przejeżdżania kursorem przez ten komponent zdarzenie MouseProc się nie wykonuje. Pytanie dlaczego czy użyłem złego komunikatu?

type
  TForm1 = class(TForm)
    label1 : TLabel;
    panel1 : TPanels;
  private
    procedure MouseProc(var Msg: TMessage); message WM_MOUSEMOVE;
  public
  end;

var
  Form1: Tform1;

procedure Tform1.MouseProc(var Msg: TMessage); 
begin
  label1.caption := inttostr(Msg.LParamLo)+'  '+inttostr(Msg.LParamHi);
end;

4

Panel tak samo jak Form dziedziczy po TWinControl więc posiada uchwyt czyli jest oknem (choć potomnym) i komunikaty dotyczące jego są kierowane do niego (przecież myszka jest nad panelem) a nie do okna Form.
Chcąc to poprawić trzeba by pobierać współrzędne kursora w kolejce komunikatów całej aplikacji a nie Form1 czyli:

//...
  private
    procedure AppMsgProc(var Msg: tagMsg; var Handled: Boolean);
//...\
implementation

{$R *.dfm}

procedure TForm1.AppMsgProc(var Msg: tagMsg; var Handled: Boolean);
begin
  if Msg.message = WM_MOUSEMOVE then
    Label1.caption:= IntToStr(LoWord(Msg.lParam)) + '  ' + IntToStr(HiWord(Msg.lParam));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage:= AppMsgProc;
end;
0

Właśnie też tak zacząłem to robić. Byłeś szybszy ,wielkie dzięki

2

A to tak jak być to dla potomnych jeszcze napiszę że w sposób opisany wyżej zawsze pokazuje współrzędne względem lewego górnego rogu kontrolki nad którą znajduje się kursor. Chcąc uzyskać względem całej Formy trzeba przeliczyć:

procedure TForm1.AppMsgProc(var Msg: tagMsg; var Handled: Boolean);
var
  p: TPoint;
begin
  if Msg.message = WM_MOUSEMOVE then
  begin
    p.X:= LoWord(Msg.lParam);
    p.Y:= HiWord(Msg.lParam);
    Windows.ClientToScreen(Msg.hwnd, p);
    Windows.ScreenToClient(Handle, p);
    Label1.Caption:= IntToStr(p.X) + '  ' + IntToStr(p.Y);
  end;
end;

W przykładzie funkcją ClientToScreen zmieniam współrzędne względem kontrolki na współrzędne względem ekranu (pierwszym parametrem jest uchwyt okna nad którym znajduje się kursor) później funkcją ScreenToClient zmieniam te współrzędne na współrzędne względem Form (pierwszym parametrem jest uchwyt Form) . Oczywiście zamiast się bawić w ClientToScreen mogłem od razu pobrać współrzędne funkcją GetCursorPos ale przykład ma pokazanie jak te współrzędne przeliczyć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1