Răspunsul la întrebarea nr. 66940

Ferestre, mesaje de fereastră | Crearea propriilor componente Reacția la tastatură, mouse Mouse |

Orei bune din timpul zilei
Scriu o componentă, moștenitorul de la TWinControl






problema cu MouseUp, este planificat să urmăriți clic pe mouse și eliberați
Când mouse-ul părăsește componenta și se eliberează MouseUp nu este apelat

Un lucru similar pe care l-am observat în TreeView, spune-mi, vă rog, cum poate fi depășită, de preferință în componenta som

și anume
MouseDown - dacă butonul din stânga este forțat să urmărească MouseUp

P.S. - în regat au existat întrebări similare, dar acestea au fost mai mult legate de tragerea componentelor, atunci trebuie doar să urmăriți evenimentele

Urmăriți răspunsurile la această întrebare prin RSS

hmm.
Într-adevăr, dacă mouse-ul este apăsat deasupra ferestrei unei alte aplicații (dacă este activ Alt + Tab), WM_LBUTTONUP nu mai vine

adăugat la încercarea de migrare din aplicația principală, că dacă suntem în modul modal, trebuie să ieșim din el și să finalizăm ultima încercare de transfer
Deci, probabil, va fi mai ușor decât implementarea acesteia la nivelul componentelor.

și procesează încă mesajul
exemplu WM_CAPTURECHANGED, dacă ați omis mouse-ul și apoi apăsați Alt + tab sau o fereastră pentru un alt motiv pentru a pierde concentrarea, WM_LBUTTONUP nu primiți, dar a lua WM_CAPTURECHANGED.

Mă sperie.
și unde să mergem, decizia conduce în mod direct la crearea unui șir de coduri și se părea că totul ar fi simplu și transparent







1.MouseDown
verificăm dacă vom trage o parte a schemei, altfel ieșim
setarea evenimentelor pentru apăsare
trecerea la modalitate, dacă ați apăsat Esc, apoi am compensat offsetul
întorcându-i pe agenții vechi

care a funcționat într-un loc incomprehensibil, atunci când utilizatorii s-au gândit să depășească componenta
Dar acum înțeleg clar ce este Capture și cu ce este

>>> Întrebarea este închisă, mulțumesc mult :-).
Tu, bineînțeles, știi cel mai bine. Dar în aceeași problemă, referința la care ați dat, există un scurt raport al lui Serghei Perovski
Opțiunea cea mai înfricoșătoare: "Programul funcționează aproape" :)

În consecință, aici este linia dvs. "în constructorul MouseCapture: = adevărat, rezolvă complet întrebarea" Sunt puțin uimită. Probabil că, din nou, aș înțelege acest lucru și cum, și numai atunci am numărat o întrebare închisă.

Mulțumită tuturor pentru răspunsuri, a fost șamanism :-)

în constructorul MouseCapture: = true; rezolvă complet problema

Pentru ușurința de muncă am provocat trecerea ferestrei la starea modală, de fapt CapturedWin

Întrebarea este închisă, vă mulțumesc foarte mult :-).

Am pus panoul pe formular și am scris


procedura TForm1.Panel1MouseDown (expeditor: TObject; buton: TMouseButton;
Schimbare: TShiftState; X, Y: Integer);
începe
Caption: = 'jos';
se încheie;

procedura TForm1.Panel1MouseUp (Expeditor: TObject; Buton: TMouseButton;
Schimbare: TShiftState; X, Y: Integer);
începe
Caption: = 'sus';
se încheie;


Și totul a funcționat minunat. Funcția de care aveți nevoie este disponibilă implicit.

Verificați dacă ați redefinit metoda


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;


în care MouseCapture în sine este setat, și dacă încă suprascris, verificați dacă sunteți de asteptare un WMLButtonDown moștenit







Articole similare

Trimiteți-le prietenilor: