Faceți clic cu mouse-ul

S-a găsit WM_LBUTTONUP, WM_LBUTTONDOWN, WM_LBUTTONDBCLK. Și aici că tipul de WM_LBUTTONCLK (singur clic pe mouse) - nu a găsit.

Cum apoi să prindeți un singur clic cu mouse-ul?

WM_LBUTTONCLK = WM_LBUTTONDOWN + WM_LBUTTONUP = BM_CLICK (pentru unele comenzi)

WM_xBUTTONDOWN, unde X este L, R, M, în funcție de butonul mouse-ului.

Iubește cartea - sursa cunoașterii

Igor Shevchenko, nu sunt de acord. BUTTONDOWN vine atunci când apăsați butonul mouse-ului (dar nu-l eliberați). Și observați că nici un control nu reacționează NUMAI la apăsarea unei chei fără al elibera. Asta este, dacă faceți clic pe butonul cu butonul stâng al mouse-ului și apoi mutați cursorul în altă locație și eliberați, evenimentul OnMouseDown nu se produce. Vreau să pun în aplicare același comportament în programul meu numai pe WinApi.

Song, WM_LBUTTONCLK = WM_LBUTTONDOWN + WM_LBUTTONUP - pe care îl înțeleg. Dar cum să urmăriți că au apăsat butonul aici și l-au eliberat?

În timpul procesării WM_xBUTTONDOWN este necesar să verificați caseta pe care este apăsat mouse-ul x pe fereastră. (De exemplu, csClicked în ControlState al TControl)
La procesarea WM_xBUTTONUP verificați dacă este bifată caseta, apoi apăsați și eliberați butonul mouse-ului (care este considerat pentru clicul, nu am fost destul de bine 08/22/02 17:49) a fost realizată pe aceeași fereastră. După aceasta, caseta de selectare este ștersă și procedura de clic este executată

Igor Shevchenko, am crezut și eu. Numai asta nu este așa. Într-adevăr, în relnosti, dacă faceți clic pe un control-clic, și apoi să ia cursorul în lateral și eliberați butonul, atunci statul este resetat csClicked. (Și dacă vinde pe circuit, apoi controlează starea heap poate fi csClicked). Aceasta este, aveți nevoie pentru a pune ceva ca un cârlig global wm_lbuttonup și verificați - dacă evenimentul a avut loc pe controlul cu starea csClicked, apăsând acolo. Dacă nu este deasupra ei, atunci starea csClicked este resetată. Acesta este IMHO și hemoroizii.
Aș dori să simplific.

Ar fi arătat Controls.pas, așa cum a fost implementat metoda TControl.Click
și când este chemat înainte de a face astfel de declarații.


procedura TControl.WMLButtonDown (var Mesaj: TWMLButtonDown);
începe
SendCancelMode (Self);
moștenit;
dacă csCaptureMouse în ControlStyle apoi MouseCapture: = Adevărat;
dacă csClickEvents în ControlStyle include apoi (FControlState, csClicked);
DoMouseDown (Mesaj, mbLeft, []);
se încheie;


procedura TControl.WMLButtonUp (var Mesaj: TWMLButtonUp);
începe
moștenit;
dacă csCaptureMouse în ControlStyle apoi MouseCapture: = False;
dacă csClicked în ControlState atunci
începe
Excludeți (FControlState, csClicked);
dacă PtInRect (ClientRect, SmallPointToPoint (Message.Pos)) apoi faceți clic pe;
se încheie;
DoMouseUp (Mesaj, mbLeft);
se încheie;

Igor Șevcenko, probabil că nu m-ai înțeles. Cred că lansarea evenimentului OnClick în TControl.click nu este doar din aceste proceduri. Cel mai ideal este dacă îmi dai codul de procedură (proceduri) care implementează Faceți clic numai cu WinApi. Dar îți apreciez timpul și, bineînțeles, nu insistă. Vreau doar să observ că dacă OnClick va fi procesat NUMAI prin aceste proceduri, veți obține un clic "incorect".

De fapt. Mutați cursorul pe elementul de control. Țineți apăsat butonul mouse-ului. Mutați cursorul în lateral. Eliberați butonul mouse-ului. Faceți clic pe butonul mouse-ului, deplasați cursorul pe elementul de control. Eliberați butonul mouse-ului. Evenimente Faceți clic nu se întâmplă.

Dacă faceți clic pe algoritmul „și descris doar două proceduri menționate mai sus. Faceți același lucru. Adică, muta cursorul de control. Țineți apăsat butonul mouse-ului. Mutați cursorul în lateral. Eliberați butonul mouse-ului. Faceți clic pe butonul mouse-ului, mutați mouse-ul pentru a controla. Eliberați butonul mouse-ului. Evenimente Faceți clic pe HAPPEN.
Prin urmare, ca la control, a existat o proprietate csClicked atunci când pe ea a fost apăsat butonul. Și când butonul PUSHED (Proprietăți csClicked) nu a fost eliminat, deoarece butonul nu a fost apăsat deasupra controlului.

Sper că i-am explicat în mod clar. Dacă asta - întrebați.

> Roxtady
Ei bine, desigur, nu doar aceste proceduri. Încă mai trebuie să vedem cum sunt implementate proprietățile care sunt utilizate în aceste proceduri. și mai specific - MouseCapture.

Comportamentul de care ai nevoie pe api este implementat de funcția SetCapture.

nikkie, este posibil mai mult în detaliu. Nu am înțeles destul de bine cum folosiți SetCapture pentru a implementa acest comportament când faceți clic.

P.S. Și din nou, întrebarea este de neînțeles. De ce este evenimentul WM_LBUTTONDBCLK acolo și evenimentul WM_LBUTTONCLK nu este prezent?

> Igor Shevchenko
> În timpul procesării WM_xBUTTONDOWN este necesar să bifați caseta pe care este apăsat mouse-ul x pe fereastră.

În cazul în care o mulțime de componente, este necesar să nu verifice și să memoreze fereastra, care a fost scăderea cheie, iar când WM_XBUTTONUP a verifica dacă acesta este pe este ridicat aceeași fereastră.

Articole similare