Najbežnejším spôsobom presunutia okna je pretiahnutie za jeho záhlavie. Čítajte ďalej, aby ste zistili, ako môžete poskytnúť možnosti pretiahnutia Delphi formuláre bez záhlavia, takže užívateľ môže presunúť formulár kliknutím kamkoľvek v oblasti klienta.
Napríklad, zvážte prípad a Windows aplikácie ktorý nemá záhlavie okna, ako môžeme presunúť také okno? V skutočnosti je možné vytvárať okná s neštandardným záhlavím a dokonca aj s pravouhlými tvarmi. Ako v takom prípade môže systém Windows vedieť, kde sú hranice a rohy okna?
Windows správa WM_NCHitTest
Operačný systém Windows je silne založený na spracovanie správ. Napríklad, keď kliknete na okno alebo ovládací prvok, systém Windows odošle správu wm_LButtonDown, s ďalšími informáciami o tom, kde sa nachádza kurzor myši a ktoré ovládacie tlačidlá sú momentálne stlačenie. Znie povedome? Áno, toto nie je nič iné ako udalosť OnMouseDown v Delphi.
Podobne Windows odošle správu wm_NCHitTest kedykoľvek a udalosť myši nastane, to znamená, keď sa kurzor pohybuje alebo keď sa stlačí alebo uvoľní tlačidlo myši.
Kód na zadanie
Ak dokážeme prinútiť Windows, aby si myslel, že používateľ ťahá (klikol na) záhlavie namiesto oblasti klienta, používateľ by mohol okno pretiahnuť kliknutím na oblasť klienta. Najjednoduchší spôsob, ako to urobiť, je oklamať Windows, aby si mysleli, že skutočne klikáte na záhlavie formulára. Čo musíte urobiť:
1. Do oddielu „Súkromné vyhlásenia“ vo formulári (vyhlásenie o postupe vybavovania správ) vložte nasledujúci riadok:
procedúra WMNCHitTest (var Msg: TWMNCHitTest); správa WM_NCHitTest;
2. Pridajte nasledujúci kód do časti „implementácia“ jednotky formulára (kde Form1 je predpokladaný názov formulára):
procedúra TForm1.WMNCHitTest (var Msg: TWMNCHitTest);
začať
zdedený;
ak Blesk. Výsledok = htClient potom Blesk. Výsledok: = htCaption;
koniec;
Prvý riadok kódu v obsluhe správ zavolá zdedenú metódu na získanie predvoleného spracovania pre správu wm_NCHitTest. Ak je súčasťou postupu, zachytáva a mení správanie vášho okna. V skutočnosti sa to stane: keď operačný systém odošle do okna správu wm_NCHitTest, spolu so súradnicami myši okno vráti kód, ktorý uvádza, ktorá časť má bol zasiahnutý. Dôležitá informácia pre našu úlohu je v hodnote Msg. Výsledkové pole. V tejto chvíli máme príležitosť zmeniť výsledok správy.
Toto robíme: ak používateľ klikol v klientskej oblasti formulára, prinútime Windows, aby si myslel, že klikol na záhlavie okna. v Objekt Pascal „slov“: ak je návratovou hodnotou správy HTCLIENT, jednoducho ju zmeníme na HTCAPTION.
Žiadne ďalšie udalosti myši
Zmenou predvoleného správania našich formulárov odstránime schopnosť systému Windows upozorniť vás, keď sa myš nachádza nad oblasťou klienta. Jedným z vedľajších účinkov tohto triku je, že váš formulár sa už nebude vytvárať udalosti pre myš správ.
Okno bez titulkov
Ak chcete bezokrajové okno bez titulkov podobné plávajúcemu panelu nástrojov, nastavte titulok formulára na prázdny reťazec, vypnite všetky BorderIcons a nastavte BorderStyle na bsNone.
Formulár je možné rôznymi spôsobmi zmeniť použitím vlastného kódu v metóde CreateParams.
Ďalšie WM_NCHitTestové triky
Ak sa pozriete pozornejšie na správu wm_NCHitTest, uvidíte, že návratová hodnota funkcie označuje polohu horúceho bodu kurzora. To nám umožňuje hrať sa so správou a vytvárať podivné výsledky.
Nasledujúci fragment kódu zabráni používateľom zatvoriť formuláre kliknutím na tlačidlo Zavrieť.
ak Blesk. Výsledok = htZatvoriť potom Blesk. Výsledok: = htNewhere;
Ak sa používateľ pokúša presunúť formulár kliknutím na panel s titulkami a potiahnutím, kód nahradí výsledok správy výsledkom, ktorý naznačuje, že používateľ klikol na oblasť klienta. To bráni užívateľovi v pohybe okna myšou (na rozdiel od toho, čo sme robili pri žobraní článku).
ak Blesk. Výsledok = htCaption potom Blesk. Výsledok: = htClient;
S komponentmi vo formulári
Vo väčšine prípadov budeme mať vo formulári niektoré komponenty. Povedzme napríklad, že jeden objekt panela je vo formulári. Ak je vlastnosť Zarovnať panelu nastavená na alClient, Panel vyplní celú oblasť klienta tak, že nie je možné vybrať nadradený formulár kliknutím naň. Vyššie uvedený kód nebude fungovať - prečo? Je to preto, že myš sa vždy pohybuje po komponente Panel, nie po formulári.
Ak chcete presunúť náš formulár pretiahnutím panela vo formulári, musíme pridať niekoľko riadkov kódu do postupu udalosti OnMouseDown pre komponent Panel:
procedúra TForm1.Panel1MouseDown
(Odosielateľ: TObject; Tlačidlo: TMouseButton;
Shift: TShiftState; X, Y: celé číslo);
začať
ReleaseCapture;
SendMessage (Form1.Handle, WM_SYSCOMMAND, 61458, 0);
koniec;
Poznámka: Tento kód nebude fungovať s ovládacími prvkami, ako sú napríklad okná Komponenty TLabel.