Klepněte a přetáhněte formulář Delphi bez lišty titulků

click fraud protection

Nejběžnějším způsobem přesunutí okna je přetažení za titulní lištu. Čtěte dále a zjistěte, jak můžete zajistit přetahování Delphi formuláře bez záhlaví, takže uživatel může přesunout formulář kliknutím kamkoli v oblasti klienta.

Zvažte například případ a Windows aplikace který nemá záhlaví, jak můžeme takové okno přesunout? Ve skutečnosti je možné vytvářet okna s nestandardním záhlavím a dokonce i obdélníkovými tvary. Jak by mohl Windows v tomto případě vědět, kde jsou hranice a rohy okna?

Zpráva WM_NCHitTest Windows

Operační systém Windows je silně založen na zpracování zpráv. Například když kliknete na okno nebo ovládací prvek, systém Windows odešle zprávu wm_LButtonDown, s dalšími informacemi o tom, kde je kurzor myši a které ovládací klávesy jsou aktuálně stisknuto. Zní to dobře? Ano, toto není nic jiného než událost OnMouseDown v Delphi.

Podobně Windows odešle zprávu wm_NCHitTest, kdykoli událost myši dojde, tj. když se kurzor pohybuje nebo když je stisknuto nebo uvolněno tlačítko myši.

instagram viewer

Kód pro zadání

Pokud dokážeme přimět Windows, aby si mysleli, že uživatel přetahuje (kliknul) na záhlaví, nikoli do oblasti klienta, pak by uživatel mohl okno přetáhnout kliknutím v oblasti klienta. Nejjednodušší způsob, jak toho dosáhnout, je "oklamat" Windows, aby si myslely, že ve skutečnosti kliknete na záhlaví formuláře. Co musíte udělat:

1. Do oddílu „Soukromá prohlášení“ ve formuláři (prohlášení o postupu zpracování zpráv) vložte následující řádek:

postup WMNCHitTest (var Msg: TWMNCHitTest); zpráva WM_NCHitTest; 

2. Přidejte následující kód do části "implementace" jednotky formuláře (kde Form1 je předpokládaný název formuláře):

postup TForm1.WMNCHitTest (var Msg: TWMNCHitTest);

začít

zdědil;

-li Msg. Výsledek = htClient pak Msg. Výsledek: = htCaption;

konec; 

První řádek kódu v obslužné rutině zprávy volá zděděnou metodu k získání výchozího zpracování zprávy wm_NCHitTest. Část Pokud procedura zachycuje a mění chování okna. To se skutečně děje: když operační systém odešle do okna zprávu wm_NCHitTest, spolu se souřadnicemi myši vrátí okno kód, který uvádí, která část má byl zasažen. Důležitá informace pro náš úkol je v hodnotě Msg. Výsledkové pole. V tomto okamžiku máme příležitost upravit výsledek zprávy.

To je to, co děláme: pokud uživatel kliknul v klientské oblasti formuláře, uděláme Windows, aby si myslel, že uživatel kliknul na záhlaví. v Objekt Pascal "slova": pokud je vrácená hodnota zprávy HTCLIENT, jednoduše ji změníme na HTCAPTION.

Žádné další události myši

Změnou výchozího chování našich formulářů odstraníme schopnost systému Windows upozornit vás, když je myš nad klientskou oblastí. Jedním z vedlejších účinků tohoto triku je, že váš formulář již nebude generován události pro myš zprávy.

Okno bez titulků

Pokud chcete bezokrajové okno bez titulků podobné plovoucímu panelu nástrojů, nastavte titulek formuláře na prázdný řetězec, zakažte všechny BorderIcons a nastavte BorderStyle na bsNone.

Formulář lze změnit různými způsoby použitím vlastního kódu v metodě CreateParams.

Další WM_NCHitTestové triky

Pokud se podíváte podrobněji na zprávu wm_NCHitTest, uvidíte, že návratová hodnota funkce označuje polohu horkého bodu kurzoru. To nám umožňuje hrát ještě více se zprávou a vytvářet podivné výsledky.

Následující fragment kódu zabrání uživatelům zavřít formuláře kliknutím na tlačítko Zavřít.

-li Msg. Výsledek = htClose pak Msg. Výsledek: = htNowhere; 

Pokud se uživatel pokouší přesunout formulář kliknutím na titulek a přetažením, nahradí kód výsledek zprávy výsledkem, který označuje, že uživatel klikl na oblast klienta. To brání uživateli v pohybu okna pomocí myši (na rozdíl od toho, co jsme dělali v žebrání článku).

-li Msg. Výsledek = htCaption pak Msg. Výsledek: = htClient; 

S komponenty na formuláři

Ve většině případů budeme mít některé komponenty ve formuláři. Řekněme například, že jeden objekt panelu je ve formuláři. Pokud je vlastnost Zarovnat panel nastavena na alClient, Panel vyplní celou klientskou oblast, takže není možné vybrat nadřazený formulář kliknutím na něj. Výše uvedený kód nebude fungovat - proč? Je to proto, že myš se vždy pohybuje po komponentě Panel, ne po formuláři.

Chcete-li přesunout náš formulář přetažením panelu ve formuláři, musíme přidat několik řádků kódu v proceduře události OnMouseDown pro komponentu Panel:

postup TForm1.Panel1MouseDown

(Odesílatel: TObject; Tlačítko: TMouseButton;
Shift: TShiftState; X, Y: celé číslo);
začít

 ReleaseCapture;

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

konec; 

Poznámka: Tento kód nebude fungovat s ovládacími prvky, jako jsou okna Komponenty TLabel.

instagram story viewer