Coś zamiast CM_MOUSEENTER i CM_MOUSELEAVE

0

Witam serdecznie, chciałbym zrobić aplikację, której lewa krawędź
będzie wystawać z prawej części ekranu a po najechaniu na nią myszką
okno wysunie się z za ekranu. Mam problem z wykryciem tego, że
kursor myszki znalazł się nad formą. Dopisałem do formy dwie procedury:

procedure CmMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CmMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;

ale działa to jakoś nie specjalnie. Najgorzej jest CM_MOUSELEAVE bo
najczęściej załapuje dopiero, kiedy kilknę gdzieś poza formą. Nie
potrafię ustalić dlaczego raz się psuje a raz nie.

Proszę o jakieś wyjaśnienie, naprowadzenie na inne rozwiązanie,
jakimś dobrym komponentem też nie pogardzę...

0

Jesli mozesz to skorzystaj z OnMouseMove jesli nie to z komunikatu WM_MOUSEMOVE, wlasnie sobie cos takiego zrobilem i swietnie to wyglada.

0

Jesli mozesz to skorzystaj z OnMouseMove jesli nie to z komunikatu WM_MOUSEMOVE, wlasnie sobie cos takiego zrobilem i swietnie to wyglada.

Można by i nawet spróbować ale nie wiem co dalej z MOUSELEAVE
a poza tym MOUSEMOVE nie działa na obramowaniu formy tylko na jej zawartości...

0

Z tym MouseMove to racja, moja pomylka bo sprawdzalem na formie bez obramowania. A z CM_MOUSELEAVE to nie wiem co moze byc bo u mnie dziala w porzadku. Denerwuje tylko to ze jesli przesune kursor nad jakis komponent to juz to sie liczy.

[Dopisane]
Wpadlem jeszcze na jeden pomysl, a mianowicie, aby cala obsluge wysuwu i chowania formy umiescic w jakims watku w ktrorym na podstawie polozenia kursora bylo by to realizowane. Oto moj kod (a raczej procedura i funkacja, bo czesci dodawanej przez srodowisko NIE MA sensu umieszczec), nie jest najlepszy ale przedstawia zasade dzialania.

Function Procedura(Point: Pointer): Cardinal;
var
  Nad, Ukryty: Boolean;
  i, j: Integer;
  P: TPoint;
begin
  Ukryty:=True;
  while (1=1) do
  begin
    Sleep(100);
    GetCursorPos(P);
    Nad:=(P.X >= Form1.Left) and (P.X <= Form1.Left + Form1.Width) and
         (P.Y >= Form1.Top)  and (P.Y <= Form1.Top + Form1.Height);
    if Ukryty then
    begin
      if Nad then
      begin
        for i:=Form1.Left to 0 do
         Form1.Left:=i;
        Ukryty:=False;
      end;
    end else
    begin
      if not Nad then
      begin
        for i:=0 downto -1*(Form1.Width - 5) do
         Form1.Left:=i;
        Ukryty:=True;
      end;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  nic: Cardinal;
begin
  Form1.Left:=-1*(Width - 5);
  CreateThread(nil, 0,@Procedura,nil,00, nic);
end;

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