Kliknite in povlecite obrazec Delphi brez vrstice z napisom

Najpogostejši način premikanja okna je, da ga povlečete po svoji naslovni vrstici. Preberite nadaljevanje, če želite izvedeti, kako lahko zagotovite zmogljivosti vlečenja DelphObrazci brez naslovne vrstice, tako da lahko uporabnik premakne obrazec s klikom kamor koli na stranko.

Na primer, razmislite o primeru a Program za Windows ki nima naslovne vrstice, kako lahko premaknemo takšno okno? Pravzaprav je mogoče ustvariti okna z nestandardno naslovno vrstico in celo ne pravokotne oblike. Kako bi v tem primeru Windows lahko vedel, kje so meje in vogali okna?

Sporočilo WM_NCHitTest za Windows

The Operacijski sistem Windows močno temelji na ravnanje s sporočili. Na primer, ko kliknete na okno ali nadzor, mu Windows pošlje sporočilo wm_LButtonDown, z dodatnimi informacijami o tem, kje je miškin kazalec in katere kontrolne tipke so trenutno stisnjeno. Se sliši znano? Da, to ni nič drugega kot dogodek OnMouseDown v Delfih.

Podobno Windows pošlje sporočilo wm_NCHitTest kadarkoli a dogodek z miško se zgodi, ko se kazalec premakne ali ko pritisnete ali sprostite gumb miške.

instagram viewer

Koda za vnos

Če lahko Windows mislimo, da uporabnik vleče (klikne) naslovno vrstico in ne odjemalca, potem lahko uporabnik povleče okno s klikom na območje odjemalca. Najlažji način za to je, da Windows "zavedete", da misli, da dejansko kliknete naslovno vrstico obrazca. Tukaj je tisto, kar morate storiti:

1. V razdelek "Zasebne izjave" obrazca (izjava o postopku obravnave sporočil) vstavite naslednjo vrstico:

postopek WMNCHitTest (var Sporočilo: TWMNCHitTest); sporočilo WM_NCHitTest; 

2. V razdelek "implementacija" enote obrazca dodajte naslednjo kodo (kjer je Form1 predpostavljeno ime obrazca):

postopek TForm1.WMNCHitTest (var Sporočilo: TWMNCHitTest);

začeti

podedovano;

če Sporoč. Rezultat = htClient torej Sporoč. Rezultat: = htCaption;

konec; 

Prva vrstica kode v obdelovalcu sporočil pokliče podedovano metodo, da pridobi privzeto ravnanje za sporočilo wm_NCHitTest. Če del v postopku prestreže in spremeni vedenje vašega okna. To se dejansko zgodi: ko operacijski sistem v okno pošlje sporočilo wm_NCHitTest, skupaj s koordinatami miške okno vrne kodo, ki navaja, kateri del sebe ima zadel. Pomemben podatek za našo nalogo je v vrednosti sporočila. Polje z rezultati. Na tej točki imamo priložnost za spremembo rezultata sporočila.

To počnemo tako: če uporabnik klikne v odjemalcu obrazca, naredimo Windows, da misli, da je uporabnik kliknil na naslovni vrstici. V Objekt Pascal "besede": če je vrednost za sporočilo HTCLIENT, jo preprosto spremenimo v HTCAPTION.

Ni več dogodkov z miško

S spreminjanjem privzetega vedenja naših obrazcev odstranimo sposobnost sistema Windows, da vas obvesti, ko je miška nad odjemalcem. Eden od stranskih učinkov tega trika je, da vaša oblika ne bo več ustvarjala dogodki za miško sporočila.

Brez okna brez napisov

Če želite okno brez roba brez napisov, podobno plavajoči orodni vrstici, nastavite napis napisa v prazen niz, onemogočite vse BorderIcons in BorderStyle nastavite na bsNone.

Obrazec lahko spremenite na različne načine z uporabo kode po meri v metodi CreateParams.

Več WM_NCHitTest trikov

Če natančneje pogledate sporočilo wm_NCHitTest, boste videli, da vrnjena vrednost funkcije kaže položaj vroče točke kurzorja. To nam omogoča, da se s sporočilom igramo še malo, da ustvarimo čudne rezultate.

Naslednji fragment kode bo uporabnikom preprečil, da bi zaprli obrazce s klikom na gumb Zapri.

če Sporoč. Rezultat = htClose torej Sporoč. Rezultat: = htNowhere; 

Če uporabnik poskuša premakniti obrazec s klikom na napisno vrstico in vlečenjem, koda nadomesti rezultat sporočila z rezultatom, ki označuje, da je uporabnik kliknil na odjemalsko območje. S tem uporabniku preprečimo, da bi okno premikal z miško (nasprotno od tistega, kar smo počeli pri prosjačenju članka).

če Sporoč. Rezultat = htCaption torej Sporoč. Rezultat: = htClient; 

Sestavni deli obrazca

V večini primerov bomo imeli nekaj komponent na obrazcu. Recimo, da je na primer en predmet plošče na obrazcu. Če je lastnost Poravnava plošče nastavljena na alClient, plošča zapolni celotno stranko, tako da ni mogoče izbrati matičnega obrazca s klikom nanj. Zgornja koda ne bo delovala - zakaj? To je zato, ker se miška vedno premika nad komponento plošče, ne po obliki.

Če želite premakniti naš obrazec z vlečenjem plošče na obrazec, moramo v postopek dogodka OnMouseDown za komponento plošče dodati nekaj vrstic kode:

postopek TForm1.Panel1MouseDown

(Pošiljatelj: TObject; Gumb: TMouseButton;
Shift: TShiftState; X, Y: Integer);
začeti

 ReleaseCapture;

 SendMessage (Form1.Handle, WM_SYSCOMMAND, 61458, 0);

konec; 

Opomba: Ta koda ne bo delovala s krmilniki brez oken, kot je Sestavni deli TLabel.

instagram story viewer