Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento přehled popisuje funkce oken, jako jsou typy oken, stavy, velikost a pozice.
- typy oken
- Vztahy oken
- Okno Zobrazit stav
- velikost a umístění okna
- animace okna
- rozložení okna a zrcadlení
- zničení okna
Typy oken
Tato část obsahuje následující témata popisující typy oken.
Překrývající se okna
překrývající se okno je okno nejvyšší úrovně (jiné než podřízené okno), které má záhlaví, ohraničení a oblast klienta; slouží jako hlavní okno aplikace. Může mít také nabídku okna, minimalizovat a maximalizovat tlačítka a posuvníky. Překrývající se okno, které se používá jako hlavní okno, obvykle zahrnuje všechny tyto součásti.
Zadáním stylu WS_OVERLAPPED nebo WS_OVERLAPPEDWINDOW ve funkci CreateWindowEx aplikace vytvoří překrývající se okno. Pokud použijete styl WS_OVERLAPPED, bude mít okno záhlaví a ohraničení. Pokud používáte styl WS_OVERLAPPEDWINDOW, má okno záhlaví, ohraničení pro změnu velikosti, nabídku okna a tlačítka pro minimalizaci a maximalizaci.
Vyskakovací okna
automaticky otevírané okno je speciální typ překrývajících se oken používaných pro dialogová okna, okna zpráv a další dočasná okna, která se zobrazují mimo hlavní okno aplikace. Titulní lišty jsou volitelné pro vyskakovací okna; jinak jsou vyskakovací okna stejná jako překryvná okna stylu WS_OVERLAPPED.
Automaticky otevírané okno vytvoříte zadáním stylu WS_POPUP v CreateWindowEx. Pokud chcete zahrnout záhlaví, zadejte styl WS_CAPTION. Pomocí stylu WS_POPUPWINDOW vytvořte automaticky otevírané okno s ohraničením a nabídkou okna. Styl WS_CAPTION se musí kombinovat se stylem WS_POPUPWINDOW, aby byla nabídka okna viditelná.
Podřízená okna
Podřízené okno má styl WS_CHILD a je omezené na klientskou oblast nadřazeného okna. Aplikace obvykle používá podřízená okna k rozdělení klientské oblasti nadřazeného okna do funkčních oblastí. Podřízené okno vytvoříte zadáním stylu WS_CHILD ve funkci CreateWindowEx.
Podřízené okno musí mít nadřazené okno. Nadřazené okno může být překrývající se okno, automaticky otevírané okno nebo dokonce jiné podřízené okno. Nadřazené okno zadáte při volání CreateWindowEx. Pokud zadáte styl WS_CHILD v CreateWindowEx, ale nezadáte nadřazené okno, systém okno nevytvoří.
Podřízené okno má klientskou oblast, ale žádné jiné funkce, pokud nejsou výslovně požadovány. Aplikace může požádat o záhlaví, nabídku okna, minimalizovat a maximalizovat tlačítka, ohraničení a posuvníky pro podřízené okno, ale podřízené okno nemůže mít nabídku. Pokud aplikace určuje popisovač nabídky, buď při registraci třídy podřízeného okna, nebo při vytvoření podřízeného okna, je popisovač nabídky ignorován. Pokud není zadán žádný styl ohraničení, vytvoří systém okno bez ohraničení. Aplikace může pomocí podřízených oken bez ohraničení rozdělit klientskou oblast nadřazeného okna a zároveň zachovat neviditelné dělení pro uživatele.
Tato část popisuje následující aspekty podřízených oken:
- umístění
- výřez
- relace k nadřazené okna
- zprávy
Umístění
Systém vždy umístí podřízené okno vzhledem k levému hornímu rohu klientské oblasti nadřazeného okna. Mimo ohraničení nadřazeného okna se nikdy nezobrazí žádná část podřízeného okna. Pokud aplikace vytvoří podřízené okno, které je větší než nadřazené okno, nebo umístí podřízené okno tak, aby některá nebo všechna podřízená okna přesahovala hranice nadřazeného okna, systém podřízené okno ořízne; to znamená, že část mimo klientskou oblast nadřazeného okna se nezobrazí. Akce, které ovlivňují nadřazené okno, mohou také ovlivnit podřízené okno následujícím způsobem.
| Nadřazené okno | Podřízené okno |
|---|---|
| Zničený | Zničeno před zničením nadřazeného okna. |
| Schovaný | Skryto před skrytím nadřazeného okna. Podřízené okno je viditelné pouze pokud je nadřazené okno viditelné. |
| Přesunuto | Přesunuto s klientskou oblastí nadřazeného okna. Podřízené okno je zodpovědné za vykreslování své klientské oblasti po přesunutí. |
| Zobrazený | Zobrazí se po zobrazení nadřazeného okna. |
Odstřižek
Systém neodřízne automaticky okno potomka z klientské oblasti rodičovského okna. To znamená, že nadřazené okno překreslí podřízené okno, pokud provádí jakékoli kreslení ve stejném umístění jako podřízené okno. Systém však vystřihne podřízené okno z klientské oblasti nadřazeného okna, pokud má nadřazené okno styl WS_CLIPCHILDREN. Pokud je podřízené okno zakryté, nadřazené okno nad ním nemůže zobrazit.
Podřízené okno může překrývat jiná podřízená okna ve stejné klientské oblasti. Podřízené okno, které sdílí stejné nadřazené okno jako jedno nebo více jiných podřízených oken, se nazývá okno sourozenecké. Sourozenecká okna mohou vykreslovat do klientské oblasti navzájem, pokud jedno z nich nemá styl WS_CLIPSIBLINGS. Pokud má podřízené okno tento styl, vystřihne se jakákoli část jeho sourozeneckého okna, která leží uvnitř podřízeného okna.
Pokud okno má styl WS_CLIPCHILDREN nebo WS_CLIPSIBLINGS, dojde k mírné ztrátě výkonu. Každé okno zabírá systémové prostředky, takže aplikace by neměla používat podřízená okna nerozlišeně. Pro zajištění nejlepšího výkonu by aplikace, která potřebuje logicky rozdělit hlavní okno, by to měla provést v postupu okna hlavního okna, a ne pomocí podřízených oken.
Vztah k nadřazenému oknu
Aplikace může změnit nadřazené okno existujícího podřízeného okna voláním funkce SetParent. V tomto případě systém odebere podřízené okno z klientské oblasti starého nadřazeného okna a přesune ho do klientské oblasti nového nadřazeného okna. Pokud SetParent určuje popisovač NULL, stane se okno pracovní plochy novým nadřazeným oknem. V tomto případě je dceřiné okno zobrazeno na ploše, mimo hranice jakéhokoli jiného okna. Funkce GetParent načte popisovač do nadřazeného okna podřízeného okna.
Nadřazené okno předá část svého klientského prostoru podřízenému oknu a podřízené okno přijímá veškerý vstup z této oblasti. Třída okna nemusí být shodná pro jednotlivá podřízená okna v rámci nadřazeného okna. To znamená, že aplikace může vyplnit nadřazené okno podřízenými okny, která vypadají jinak a provádějí různé úlohy. Například dialogové okno může obsahovat mnoho typů ovládacích prvků, každé jedno podřízené okno, které přijímá různé typy dat od uživatele.
Podřízené okno má pouze jedno nadřazené okno, ale nadřazené okno může mít libovolný počet podřízených oken. Každé podřízené okno může mít také další podřízená okna. V tomto řetězci oken se každé podřízené okno nazývá potomk původního nadřazeného okna. Aplikace používá funkci IsChild zjistit, jestli je dané okno podřízeným oknem nebo následným oknem daného nadřazeného okna.
Funkce EnumChildWindows výčet podřízených oken nadřazeného okna. Potom EnumChildWindows předá popisovač každého podřízeného okna na funkci zpětného volání definovanou aplikací. Okna potomků daného nadřazeného okna jsou také uvedena.
Zprávy
Systém předá vstupní zprávy podřízeného okna přímo do podřízeného okna; zprávy nejsou předány prostřednictvím nadřazeného okna. Jedinou výjimkou je, pokud bylo podřízené okno zakázáno funkcí EnableWindow. V tomto případě systém předá všechny vstupní zprávy, které by místo toho přešly do podřízeného okna do nadřazeného okna. To umožňuje nadřazené okno zkoumat vstupní zprávy a v případě potřeby povolit podřízené okno.
Podřízené okno může mít jedinečný celočíselný identifikátor. Identifikátory podřízených oken jsou důležité při práci s ovládacími okny. Aplikace směruje aktivitu ovládacího prvku odesláním zpráv. Aplikace používá identifikátor podřízeného okna ovládacího prvku k nasměrování zpráv na ovládací prvek. Ovládací prvek navíc odesílá zprávy s oznámením do nadřazeného okna. Zpráva s oznámením obsahuje identifikátor podřízeného okna ovládacího prvku, který nadřazený objekt používá k identifikaci ovládacího prvku, který zprávu odeslal. Aplikace určuje identifikátor podřízeného okna pro jiné typy podřízených oken nastavením parametru hMenu funkce CreateWindowEx na hodnotu místo popisovače nabídky.
Vrstvené okna
Použití vrstveného okna může výrazně zlepšit výkon a vizuální efekty pro okno, které má složitý tvar, animuje svůj tvar nebo využívá efekty alpha blendingu. Systém automaticky sestaví a překreslí vrstvené okna a okna podkladových aplikací. V důsledku toho se vrstvená okna vykreslují hladce, bez blikání typického pro složité oblasti oken. Kromě toho může být vrstvené okno částečně průsvitné, tj. alfa-smíšené.
Chcete-li vytvořit vrstvené okno, zadejte WS_EX_LAYERED rozšířený styl okna při volání CreateWindowEx funkce, nebo zavolejte funkci SetWindowLong nastavit WS_EX_LAYERED po vytvoření okna. Po volání CreateWindowEx se vrstvené okno nezobrazí, dokud SetLayeredWindowAttributes nebo UpdateLayeredWindow funkce byla volána pro toto okno.
Poznámka
Počínaje Systémem Windows 8 je možné WS_EX_LAYERED používat s podřízenými okny a okny nejvyšší úrovně. Předchozí verze Windows podporují WS_EX_LAYERED pouze pro okna nejvyšší úrovně.
Pokud chcete nastavit úroveň neprůhlednosti nebo barevný klíč průhlednosti pro dané vrstvené okno, zavolejte SetLayeredWindowAttributes. Po volání může systém i nadále požádat okno, aby maloval, když se okno zobrazí nebo změní jeho velikost. Vzhledem k tomu, že systém ukládá obrázek vrstveného okna, systém nebude žádat okno, aby vykreslovalo, pokud budou části odkryty v důsledku pohybů relativních oken na pracovní ploše. Starší aplikace nemusí restrukturalizovat kód vykreslování, pokud chtějí přidat průsvitné nebo průhledné efekty pro okno, protože systém přesměruje vykreslování oken, která volají SetLayeredWindowAttributes do paměti mimo obrazovku a znovu skládá, aby dosáhl požadovaného efektu.
Pro rychlejší a efektivnější animaci, nebo pokud je potřeba alfa pro jednotlivé pixely, zavolejte UpdateLayeredWindow. UpdateLayeredWindow by se měl používat především v případě, že aplikace musí přímo zadat obrazec a obsah vrstveného okna, aniž by systém používal mechanismus přesměrování, který systém poskytuje prostřednictvím SetLayeredWindowAttributes. Kromě toho použití UpdateLayeredWindow přímo používá paměť efektivněji, protože systém nepotřebuje další paměť potřebnou k uložení obrázku přesměrovaného okna. Pro zajištění maximální efektivity při animaci oken zavolejte UpdateLayeredWindow změnit pozici a velikost vrstveného okna. Upozorňujeme, že po zavolání SetLayeredWindowAttributes následující volání UpdateLayeredWindow selžou, dokud se bit stylu vrstvení nevymaže a znovu nenastaví.
Testování vrstveného okna je založeno na tvaru a průhlednosti okna. To znamená, že oblasti okna, které jsou barevně zabarvené nebo jejichž alfa hodnota je nula, umožní zprávy myši procházet. Pokud má však vrstvené okno WS_EX_TRANSPARENT rozšířený styl okna, bude tvar vrstveného okna ignorován a události myši budou předány do jiných oken pod vrstveným oknem.
Okna pouze pro zprávy
Okno pouze pro zprávy umožňuje odesílat a přijímat zprávy. Není viditelný, nemá žádné pořadí vrstev, nelze vyjmenovat a nepřijímá hromadné zprávy. Okno jednoduše odesílá zprávy.
Chcete-li vytvořit okno pouze se zprávou, zadejte konstantu HWND_MESSAGE v parametru hWndParentfunkce CreateWindowEx . Existující okno můžete také změnit na okno pouze se zprávou zadáním HWND_MESSAGE v parametru hWndNewParent funkce SetParent.
Chcete-li najít okna pouze se zprávami, zadejte HWND_MESSAGE v parametru hwndParent funkce FindWindowEx. Kromě toho FindWindowEx prohledá okna pouze se zprávami a také okna nejvyšší úrovně, pokud jsou parametry hwndParent i hwndChildAfterNULL.
Vztahy mezi okny
Existuje mnoho způsobů, jak může okno souviset s uživatelem nebo jiným oknem. Okno může být vlastněné okno, okno popředí nebo okno pozadí. Okno má také z-řád vzhledem k jiným oknům. Další informace najdete v následujících tématech:
Okna popředí a na pozadí
Každý proces může mít více vláken spuštění a každé vlákno může vytvářet okna. Vlákno, které vytvořilo okno, se kterým uživatel právě pracuje, se nazývá vlákno popředí a okno se nazývá okno popředí. Všechna ostatní vlákna jsou vlákna na pozadí a okna vytvořená vlákny pozadí se nazývají okna pozadí.
Každé vlákno má úroveň priority, která určuje množství času procesoru, které vlákno obdrží. I když aplikace může nastavit úroveň priority svých vláken, obvykle má vlákno popředí mírně vyšší úroveň priority než vlákna na pozadí. Vzhledem k tomu, že má vyšší prioritu, vlákno popředí přijímá více času procesoru než vlákna na pozadí. Vlákno popředí má normální základní prioritu 9; vlákno na pozadí má normální základní prioritu 7.
Uživatel nastaví okno popředí kliknutím na okno nebo kombinací kláves ALT+TAB nebo ALT+ESC. Pokud chcete získat popisovač okna popředí, použijte funkci GetForegroundWindow. Pokud chcete zkontrolovat, jestli je okno vaší aplikace oknem popředí, porovnejte popisovač vrácený GetForegroundWindow s popisovačem vašeho aplikačního okna.
Aplikace nastaví okno popředí pomocí funkce SetForegroundWindow.
Systém omezuje procesy, které mohou nastavit okno popředí. Proces může nastavit okno popředí pouze v případě, že:
- Platí všechny následující podmínky:
- Proces volání SetForegroundWindow patří do desktopové aplikace, nikoli do aplikace pro UPW nebo aplikace pro Windows Store určená pro Windows 8 nebo 8.1.
- Popřední proces nezakázal volání SetForegroundWindow pomocí předchozího volání funkce LockSetForegroundWindow.
- Vypršel časový limit uzamčení popředí (viz SPI_GETFOREGROUNDLOCKTIMEOUT v SystemParametersInfo).
- Nejsou aktivní žádné nabídky.
- Navíc platí alespoň jedna z následujících podmínek:
- Volající proces je aktivní proces.
- Proces volání byl zahájen procesem popředí.
- V současné době neexistuje žádné okno popředí, a proto není žádný proces popředí.
- Volající proces přijal poslední vstupní událost.
- Buď je laděn proces popředí, nebo volající proces.
Procesu může být odepřeno právo nastavit okno na popředí, i když splňuje tyto podmínky.
Proces, který může nastavit okno popředí, může povolit jiný proces nastavit okno popředí voláním AllowSetForegroundWindow funkce, nebo voláním BroadcastSystemMessage funkce s příznakem BSF_ALLOWSFW. Proces popředí může zakázat volání SetForegroundWindow voláním funkce LockSetForegroundWindow.
Vlastněná okna
Překrývající se nebo vyskakovací okno může být vlastněno jiným překrývajícím se nebo vyskakovacím oknem. Vlastnictví klade na okno několik omezení.
- Vlastní okno je vždy nad svým vlastníkem v z-řádu.
- Systém automaticky zničí vlastněné okno, když je jeho vlastník zničen.
- Když je vlastník minimalizován, jeho okno se skryje.
Pouze překryvné nebo vyskakovací okno může být oknem vlastníka; podřízené okno nemůže být oknem vlastníka. Aplikace vytvoří vlastněné okno zadáním popisovače okna vlastníka jako parametr hwndParent funkce CreateWindowEx při vytváření okna se stylem WS_OVERLAPPED nebo WS_POPUP. Parametr hwndParent musí identifikovat překrývající se nebo automaticky otevírané okno. Pokud hwndParent identifikuje podřízené okno, systém přiřadí vlastnictví oknu na nejvyšší úrovni, které je nadřazené podřízenému oknu. Po vytvoření vlastněného okna nemůže aplikace převést vlastnictví okna do jiného okna.
Dialogová okna a okna zpráv jsou ve výchozím nastavení vlastněná okny. Aplikace určuje okno vlastníka při volání funkce, která vytvoří dialogové okno nebo okno zprávy.
Aplikace může pomocí funkce GetWindow s příznakem GW_OWNER získat popisovač vlastníka okna.
Z-Order
z-řád okna označuje pozici okna v pořadí překrývajících se oken. Tento stoh oken je orientovaný podél imaginární osy, osy z, která se rozšiřuje ven z obrazovky. Okno v horní části pořadí zobrazení překrývá všechna ostatní okna. Okno v dolní části z-posloupnosti je překryto všemi ostatními okny.
Systém udržuje pořadí vykreslování v jednom seznamu. Přidá okna do pořadí vykreslování podle toho, jestli se jedná o okna nejvyšší úrovně, okna nejvyšší úrovně nebo podřízená okna. Vrchní okno překrývá všechna ostatní okna, bez ohledu na to, jestli se jedná o aktivní nebo popředí okno. Horní okno má styl WS_EX_TOPMOST. Všechna okna nejvyšší úrovně se zobrazí v z-řádu před jakýmikoli okny, která nejsou nejvyšší úrovně. Podřízené okno je seskupené s nadřazeným oknem v z-řádu.
Když aplikace vytvoří okno, systém ho umístí na začátek pořadí pro okna stejného typu. Funkci BringWindowToTop můžete použít k přemístění okna na vrchol pořadí zobrazení pro okna stejného typu. Pořadí vrstev (z-order) můžete změnit pomocí funkcí SetWindowPos a DeferWindowPos.
Uživatel změní pořadí zobrazení aktivací jiného okna. Systém umístí aktivní okno v horní části z-pořadí pro okna stejného typu. Když se okno dostane na začátek pořadí vykreslování, stejně tak se tam dostanou jeho podřízená okna. Pomocí funkce GetTopWindow můžete prohledávat všechna podřízená okna nadřazeného okna a vrátit popisovač do podřízeného okna, které je nejvyšší v pořadí z. Funkce GetNextWindow načte popisovač na další nebo předchozí okno v z-řádu.
Stav zobrazení okna
V každém okamžiku může být okno aktivní nebo neaktivní; skryté nebo viditelné; a minimalizované, maximalizované nebo obnovené. Tyto vlastnosti jsou označovány souhrnně jako stav zobrazení okna. Následující témata popisují stav zobrazení okna:
Aktivní okno
aktivní okno je okno nejvyšší úrovně aplikace, se kterou uživatel právě pracuje. Aby uživatel mohl snadno identifikovat aktivní okno, systém ho umístí do horní části pořadí vykreslování a změní barvu záhlaví a ohraničení na barvy aktivního aktivního okna definované systémem. Aktivní okno může být pouze okno nejvyšší úrovně. Když uživatel pracuje s podřízeným oknem, systém aktivuje nadřazené okno spojené s podřízeným oknem.
V systému je aktivní jenom jedno okno nejvyšší úrovně. Uživatel aktivuje okno nejvyšší úrovně tak, že na něj klikne (nebo na jedno z podřízených oken) nebo pomocí kombinace kláves ALT+ESC nebo ALT+TAB. Aplikace aktivuje okno nejvyšší úrovně voláním funkce SetActiveWindow. Jiné funkce mohou způsobit, že systém aktivuje jiné okno nejvyšší úrovně, včetně SetWindowPos, DeferWindowPos, SetWindowPlacementa DestroyWindow. I když aplikace může kdykoli aktivovat jiné okno nejvyšší úrovně, aby se zabránilo matoucímu uživateli, mělo by to udělat pouze v reakci na akci uživatele. Aplikace používá funkci GetActiveWindow k načtení popisovače k aktivnímu oknu.
Když se aktivace změní z okna nejvyšší úrovně jedné aplikace do okna nejvyšší úrovně jiného, systém odešle WM_ACTIVATEAPP zprávu oběma aplikacím a upozorní je na změnu. Když se aktivace změní na jiné okno nejvyšší úrovně ve stejné aplikaci, systém odešle obě okna WM_ACTIVATE zprávu.
Zakázaná okna
Okno je možné zakázat. zakázané okno od uživatele neobdrží žádný vstup klávesnice nebo myši, ale může přijímat zprávy z jiných oken, z jiných aplikací a ze systému. Aplikace obvykle zakáže okno, aby uživatel nemohl okno používat. Aplikace může například zakázat tlačítko v dialogovém okně, aby ho uživatel nemohl zvolit. Aplikace může kdykoli povolit zakázané okno; povolením okna obnovíte normální vstup.
Ve výchozím nastavení je při vytváření povolené okno. Aplikace ale může zadat styl WS_DISABLED, aby se zakázalo nové okno. Aplikace povolí nebo zakáže existující okno pomocí funkce EnableWindow. Systém odešle WM_ENABLE zprávu do okna, když se chystá změnit jeho povolený stav. Aplikace může určit, zda je okno povoleno pomocí funkce IsWindowEnabled.
Když je podřízené okno zakázané, systém předá vstupní zprávy myši podřízeného okna do nadřazeného okna. Nadřazené okno používá zprávy k určení, zda povolit podřízené okno. Další informace naleznete v tématu Vstup myši.
Pouze jedno okno může najednou přijímat vstup z klávesnice; tomuto oknu se říká, že má klávesnicový fokus. Pokud aplikace používá funkci EnableWindow k zakázání okna s fokusovanou klávesnicí, okno ztratí fokus klávesnice, a navíc se zakáže. EnableWindow pak nastaví fokus klávesnice na NULL, což znamená, že žádné okno nemá fokus. Pokud má podřízené okno nebo jiné okno potomků fokus klávesnice, pak okno potomka ztratí fokus, když je nadřazené okno zakázané. Další informace naleznete v tématu vstup klávesnice.
Viditelnost okna
Okno může být viditelné nebo skryté. Systém na obrazovce zobrazí viditelné okno. Skryje skryté okno tím, že ho nenakreslete. Pokud je okno viditelné, může uživatel zadat vstup do okna a zobrazit výstup okna. Pokud je okno skryté, je účinně zakázáno. Skryté okno může zpracovávat zprávy ze systému nebo z jiných oken, ale nemůže zpracovat vstup od uživatele nebo zobrazit výstup. Aplikace při vytváření okna nastaví stav viditelnosti okna. Později může aplikace změnit stav viditelnosti.
Okno se zobrazí, když je pro okno nastaven styl WS_VISIBLE. Ve výchozím nastavení CreateWindowEx funkce vytvoří skryté okno, pokud aplikace neurčí styl WS_VISIBLE. Aplikace obvykle nastaví WS_VISIBLE styl poté, co vytvoří okno, aby byly podrobnosti procesu vytváření skryté uživateli. Aplikace může například zachovat nové okno skryté, když přizpůsobí vzhled okna. Pokud je styl WS_VISIBLE zadán v CreateWindowEx, systém odešle WM_SHOWWINDOW zprávu do okna po vytvoření okna, ale před zobrazením.
Aplikace může určit, jestli je okno viditelné pomocí funkce IsWindowVisible. Aplikace může zobrazit (zobrazit) nebo skrýt okno pomocí ShowWindow, SetWindowPos, DeferWindowPosnebo SetWindowPlacement nebo SetWindowLong funkce. Tyto funkce zobrazí nebo skryjí okno nastavením nebo odebráním stylu WS_VISIBLE okna. Před zobrazením nebo skrytím také odešlou zprávu WM_SHOWWINDOW do okna.
Když je minimalizované okno vlastníka, systém automaticky skryje přidružená vlastní okna. Podobně když se obnoví okno vlastníka, systém automaticky zobrazí přidružená vlastní okna. V obou případech systém před skrytím nebo zobrazením odešle zprávu WM_SHOWWINDOW do vlastněných oken. Někdy může aplikace potřebovat skrýt vlastněná okna, aniž by bylo nutné minimalizovat nebo skrýt vlastníka. V tomto případě aplikace používá funkci ShowOwnedPopups. Tato funkce nastaví nebo odebere styl WS_VISIBLE pro všechna vlastněná okna a před skrytím nebo zobrazením odešle zprávu WM_SHOWWINDOW do vlastněných oken. Skrytí okna vlastníka nemá žádný vliv na stav viditelnosti vlastněných oken.
Když je zobrazené nadřazené okno, zobrazí se také přidružená podřízená okna. Podobně platí, že pokud je nadřazené okno skryté, jsou jeho podřízená okna také skrytá. Minimalizace nadřazeného okna nemá žádný vliv na stav viditelnosti podřízených oken; to znamená, že podřízená okna jsou minimalizovaná spolu s nadřazeným objektem, ale styl WS_VISIBLE se nezmění.
I když má okno styl WS_VISIBLE, uživatel nemusí být schopen zobrazit okno na obrazovce; jiná okna se můžou úplně překrývat nebo byla přesunuta za okraj obrazovky. Viditelné podřízené okno také podléhá pravidlům výřezu vytvořeným vztahem nadřazeného a podřízeného objektu. Pokud není nadřazené okno viditelné, nebude viditelné ani samotné okno. Pokud se nadřazené okno přesune nad okraj obrazovky, přesune se také podřízené okno, protože podřízené okno je vykresleno vzhledem k levému hornímu rohu nadřazeného objektu. Uživatel může například přesunout nadřazené okno obsahující podřízené okno dostatečně daleko od okraje obrazovky, že uživatel nemusí vidět podřízené okno, i když podřízené okno i nadřazené okno mají WS_VISIBLE styl.
Minimalizovaná, maximalizovaná a obnovená okna
maximalizované okno je okno se stylem WS_MAXIMIZE. Ve výchozím nastavení systém zvětší maximalizované okno tak, aby vyplnil obrazovku nebo v případě podřízeného okna klientskou oblast nadřazeného okna. I když velikost okna může být nastavena na stejnou velikost maximalizovaného okna, maximalizované okno se mírně liší. Systém automaticky přesune záhlaví okna do horní části obrazovky nebo do horní části klientské oblasti nadřazeného okna. Systém také zakáže velikost ohraničení okna a možnosti umístění okna záhlaví (aby uživatel nemohl okno přesunout přetažením záhlaví).
minimalizované okno je okno se stylem WS_MINIMIZE. Ve výchozím nastavení systém zmenšuje minimalizované okno na velikost tlačítka hlavního panelu a přesune minimalizované okno na hlavní panel. obnovené okno je okno, které bylo vráceno do předchozí velikosti a pozice, tj. velikost, kterou byla před minimalizací nebo maximalizací.
Pokud aplikace určuje styl WS_MAXIMIZE nebo WS_MINIMIZE ve funkci CreateWindowEx, okno se zpočátku maximalizuje nebo minimalizuje. Po vytvoření okna může aplikace k minimalizaci okna použít funkci CloseWindow. Funkce ArrangeIconicWindows uspořádá ikony na ploše, nebo uspořádá minimalizovaná podřízená okna v nadřazeném okně. Funkce OpenIcon obnoví minimalizované okno na předchozí velikost a pozici.
Funkce ShowWindow může minimalizovat, maximalizovat nebo obnovit okno. Může také nastavit viditelnost a stavy aktivace okna. Funkce SetWindowPlacement zahrnuje stejné funkce jako ShowWindow, ale může přepsat výchozí minimalizované, maximalizované a obnovené pozice okna.
Funkce IsZoomed a IsIconic určují, jestli je dané okno maximalizované nebo minimalizované. Funkce GetWindowPlacement načte minimalizované, maximalizované a obnovené pozice okna a také určuje stav zobrazení okna.
Když systém obdrží příkaz k maximalizaci nebo obnovení minimalizovaného okna, odešle zprávu WM_QUERYOPEN oknu. Pokud procedura okna vrátí FALSE, systém ignoruje příkaz maximalizovat nebo obnovit.
Systém automaticky nastaví velikost a pozici maximalizovaného okna na výchozí hodnoty definované systémem pro maximalizované okno. Pokud chcete tyto výchozí hodnoty přepsat, může aplikace buď volat funkci SetWindowPlacement, nebo zpracovat WM_GETMINMAXINFO zprávu, která se přijme v okně, když se systém chystá maximalizovat okno. WM_GETMINMAXINFO obsahuje ukazatel na strukturu MINMAXINFO obsahující hodnoty, které systém používá k nastavení maximalizované velikosti a pozice. Nahrazení těchto hodnot přepíše výchozí hodnoty.
Velikost a umístění okna
Velikost a umístění okna se vyjadřují jako ohraničující obdélník vzhledem k obrazovce nebo nadřazenému oknu. Souřadnice okna nejvyšší úrovně jsou relativní vzhledem k levému hornímu rohu obrazovky; souřadnice podřízeného okna jsou relativní vzhledem k levému hornímu rohu nadřazeného okna. Aplikace určuje počáteční velikost a umístění okna při vytváření okna, ale může kdykoli změnit velikost a umístění okna. Další informace naleznete v tématu vyplněné obrazce.
Tato část obsahuje následující témata:
- výchozí velikost a umístění
- Sledovací velikost
- Systémové příkazy
- Funkce velikosti a umístění
- velikost a umístění zpráv
Výchozí velikost a umístění
Aplikace může systému umožnit vypočítat počáteční velikost nebo pozici okna nejvyšší úrovně zadáním CW_USEDEFAULT v CreateWindowEx. Pokud aplikace nastaví souřadnice okna na CW_USEDEFAULT a nevytvořila žádná další okna nejvyšší úrovně, systém nastaví pozici nového okna vzhledem k levému hornímu rohu obrazovky; v opačném případě nastaví pozici relativní k pozici okna nejvyšší úrovně, kterou aplikace vytvořila naposledy. Pokud jsou parametry šířky a výšky nastaveny na CW_USEDEFAULT, systém vypočítá velikost nového okna. Pokud aplikace vytvořila další okna nejvyšší úrovně, systém zarovná velikost nového okna na velikosti naposledy vytvořeného okna nejvyšší úrovně aplikace. Zadání CW_USEDEFAULT při vytváření podřízeného nebo automaticky otevíracího okna způsobí, že systém nastaví velikost okna na výchozí minimální velikost okna.
Velikost sledování
Systém udržuje minimální a maximální velikost sledování pro okno WS_THICKFRAME stylu; okno s tímto stylem má ohraničení velikosti. Minimální velikost sledování je nejmenší velikost okna, kterou můžete vytvořit přetažením ohraničení okna. Podobně maximální velikost sledování je největší velikost okna, kterou můžete vytvořit přetažením ohraničení velikosti.
Minimální a maximální velikost sledování okna se při vytváření okna nastaví na výchozí hodnoty definované systémem. Aplikace může zjistit výchozí hodnoty a přepsat je zpracováním zprávy WM_GETMINMAXINFO. Další informace naleznete v tématu Velikost a umístění zprávy.
Systémové příkazy
Aplikace, která má nabídku okna, může změnit velikost a umístění tohoto okna odesláním systémových příkazů. Systémové příkazy se generují, když uživatel vybere příkazy z nabídky okna. Aplikace může emulovat akci uživatele odesláním WM_SYSCOMMAND zprávy do okna. Následující systémové příkazy ovlivňují velikost a umístění okna.
| Příkaz | Popis |
|---|---|
| SC_CLOSE | Zavře okno. Tento příkaz odešle do okna zprávu WM_CLOSE. Okno provádí všechny kroky potřebné k vyčištění a zničení samo sebe. |
| SC_MAXIMIZE | Maximalizuje okno. |
| SC_MINIMIZE | Minimalizuje okno. |
| SC_MOVE | Přesune okno. |
| SC_RESTORE | Obnoví minimalizované nebo maximalizované okno na předchozí velikost a pozici. |
| SC_SIZE | Spustí příkaz pro velikost. Pokud chcete změnit velikost okna, použijte myš nebo klávesnici. |
Funkce velikostí a umístění
Po vytvoření okna může aplikace nastavit velikost nebo pozici okna voláním jedné z několika různých funkcí, včetně SetWindowPlacement, MoveWindow, SetWindowPosa DeferWindowPos. SetWindowPlacement nastaví minimalizovanou pozici okna, maximalizovanou pozici, obnovenou velikost a pozici a zobrazí stav. Funkce MoveWindow a SetWindowPos jsou podobné; obě nastaví velikost nebo pozici jednoho okna aplikace. Funkce SetWindowPos obsahuje sadu příznaků, které ovlivňují stav zobrazení okna; MoveWindow tyto příznaky nezahrnují. Pomocí funkce BeginDeferWindowPos, DeferWindowPosa EndDeferWindowPos současně nastavte pozici řady oken, včetně velikosti, pozice, pozice v pořadí z a zobrazení stavu.
Aplikace může načíst souřadnice ohraničujícího obdélníku okna pomocí funkce GetWindowRect. GetWindowRect vyplní strukturu RECT souřadnicemi levého horního a pravého dolního rohu okna. Souřadnice jsou vzhledem k levému hornímu rohu obrazovky relativní, dokonce i pro podřízené okno. Funkce ScreenToClient nebo MapWindowPoints mapuje ohraničující obdélník podřízeného okna z obrazovkových souřadnic na souřadnice v klientské oblasti nadřazeného okna.
Funkce GetClientRect načte souřadnice klientské oblasti okna. GetClientRect vyplní strukturu RECT souřadnicemi levého horního a pravého dolního rohu klientské oblasti, ale souřadnice jsou relativní k samotné klientské oblasti. To znamená, že souřadnice levého horního rohu klientské oblasti jsou vždy (0,0) a souřadnice pravého dolního rohu jsou šířka a výška klientské oblasti.
Funkce CascadeWindows kaskáduje okna na ploše nebo kaskáduje podřízená okna zadaného nadřazeného okna. Funkce TileWindows uspořádá okna na ploše nebo podřízená okna zadaného nadřazeného okna.
Velikost a umístění zpráv
Systém odešle WM_GETMINMAXINFO zprávu do okna, jehož velikost nebo pozice se chystá změnit. Zpráva se například odešle, když uživatel klikne na Přesunout nebo Velikost z nabídky okna nebo klikne na ohraničení velikosti nebo záhlaví; zpráva se odešle také při volání aplikace SetWindowPos přesunout nebo změnit velikost okna. WM_GETMINMAXINFO obsahuje ukazatel na strukturu MINMAXINFO obsahující výchozí maximalizovanou velikost a umístění okna a také výchozí minimální a maximální velikost sledování. Aplikace může přepsat výchozí hodnoty zpracováním WM_GETMINMAXINFO a nastavením příslušných členů MINMAXINFO. Okno musí mít styl WS_THICKFRAME nebo WS_CAPTION pro příjem WM_GETMINMAXINFO. Okno se stylem WS_THICKFRAME obdrží tuto zprávu během procesu vytváření okna i při přesouvání nebo velikosti.
Systém odešle WM_WINDOWPOSCHANGING zprávu pro okno, jehož velikost, pozice, pozice v z-řádu nebo stav zobrazení se chystá změnit. Tato zpráva obsahuje ukazatel na strukturu WINDOWPOS, která určuje novou velikost, pozici, pozici okna v z-řádu a stav zobrazení. Nastavením členů WINDOWPOSmůže aplikace ovlivnit novou velikost, umístění a vzhled okna.
Po změně velikosti okna, jeho pozice, pozice v z-řádu nebo zobrazení stavu odešle systém do okna zprávu WM_WINDOWPOSCHANGED. Tato zpráva obsahuje ukazatel na WINDOWPOS, který informuje okno o nové velikosti, pozici, pozici v pořadí z a zobrazení stavu. Nastavení členů struktury WINDOWPOS, která je předána s WM_WINDOWPOSCHANGED nemá na okno žádný vliv. Okno, které musí zpracovávat WM_SIZE a zprávy WM_MOVE musí předávat WM_WINDOWPOSCHANGED funkciDefWindowProc; jinak systém neodesílá WM_SIZE a WM_MOVE zprávy do okna.
Systém zasílá zprávu WM_NCCALCSIZE oknu, když je okno vytvořeno nebo změněno jeho velikost. Systém používá zprávu k výpočtu velikosti klientské oblasti okna a umístění klientské oblasti vzhledem k levému hornímu rohu okna. Okno obvykle předává tuto zprávu do výchozí procedury okna; Tato zpráva ale může být užitečná v aplikacích, které přizpůsobují oblast bez klienta okna nebo zachovávají části klientské oblasti, pokud je okno velké. Další informace naleznete v tématu malování a kreslení.
Animace okna
Při zobrazení nebo skrytí oken můžete vytvořit speciální efekty pomocí funkce AnimateWindow. Když je okno tímto způsobem animováno, systém buď obrátí, posune, nebo ztlumí okno, v závislosti na příznakech, které zadáte ve volání AnimateWindow.
Ve výchozím nastavení systém používá animaci rolování. Díky tomuto efektu se okno zobrazí jako otevřené (se zobrazeným oknem) nebo zavřené (skrytí okna). Pomocí parametru dwFlags můžete určit, jestli se okno vodorovně, svisle nebo diagonálně válí.
Když zadáte příznak AW_SLIDE, systém použije animaci snímku. Díky tomuto efektu se okno objeví (zobrazení okna) nebo zmizí (skrytí okna). Pomocí parametru dwFlags můžete určit, jestli se okno posune vodorovně, svisle nebo diagonálně.
Když zadáte příznak AW_BLEND, systém použije alfa-blended fade.
Pomocí příznaku AW_CENTER můžete také dosáhnout efektu, kdy se okno zdá zhroutit dovnitř nebo rozšířit směrem ven.
Rozložení a zrcadlení oken
Rozvržení okna určuje, jak jsou text a objekty Windows Graphics Device Interface (GDI) rozmístěny v okně nebo kontextu zařízení (DC). Některé jazyky, jako je angličtina, francouzština a němčina, vyžadují rozložení Zleva doprava (LTR). Jiné jazyky, jako je arabština a hebrejština, vyžadují rozložení zprava doleva (RTL). Rozložení okna platí pro text, ale také ovlivňuje ostatní prvky GDI okna, včetně rastrových obrázků, ikon, umístění původu, tlačítek, kaskádových ovládacích prvků stromu a toho, jestli se vodorovná souřadnice zvyšuje při přechodu doleva nebo doprava. Například po nastavení rozložení RTL aplikace se počátek umístí na pravý okraj okna nebo zařízení a číslo představující vodorovnou souřadnici se při pohybu doleva zvýší. Rozložení okna však neovlivní všechny objekty. Například rozložení dialogových oken, polí zpráv a kontextů zařízení, které nejsou přidruženy k oknu, jako je například metasoubor a řadiče domény tiskárny, musí být zpracováváno samostatně. Podrobnosti o těchto tématech jsou uvedeny dále v tomto tématu.
Funkce okna umožňují zadat nebo změnit rozložení okna v arabštině a hebrejštině ve Windows. Všimněte si, že změna rozložení RTL (označované také jako zrcadlení) není podporována pro okna, která mají styl CS_OWNDC nebo dc s grafickým režimem GM_ADVANCED.
Ve výchozím nastavení je rozložení okna zleva doprava (LTR). Pokud chcete nastavit rozložení okna RTL, zavolejte CreateWindowEx se stylem WS_EX_LAYOUTRTL. Ve výchozím nastavení má podřízené okno (tj. okno vytvořené se stylem WS_CHILD a platným nadřazeným parametrem hWnd ve volání CreateWindow nebo CreateWindowEx) stejné rozložení jako nadřazený objekt. Pokud chcete zakázat dědičnost zrcadlení u všech podřízených oken, specifikujte WS_EX_NOINHERITLAYOUT ve volání funkce CreateWindowEx. Všimněte si, zrcadlení není zděděno vlastními okny (těmi vytvořenými bez stylu WS_CHILD) nebo těmi vytvořenými s nadřazeným parametrem hWnd v CreateWindowEx nastaveným na NULL. Pokud chcete zakázat dědičnost zrcadlení pro jednotlivá okna, zpracujte zprávu WM_NCCREATE pomocí GetWindowLong a SetWindowLong vypnout příznak WS_EX_LAYOUTRTL. Toto zpracování je nad rámec jakéhokoli dalšího potřebného zpracování. Následující fragment kódu ukazuje, jak se to dělá.
SetWindowLong (hWnd,
GWL_EXSTYLE,
GetWindowLong(hWnd,GWL_EXSTYLE) & ~WS_EX_LAYOUTRTL))
Výchozí rozložení můžete nastavit na RTL voláním SetProcessDefaultLayout(LAYOUT_RTL). Všechna okna vytvořená po volání se zrcadlí, ale stávající okna nejsou ovlivněna. Pokud chcete vypnout výchozí zrcadlení, zavolejte SetProcessDefaultLayout(0).
Všimněte si, SetProcessDefaultLayout odráží kontexty zařízení pouze u zrcadlených oken. Pokud chcete zrcadlit libovolný kontext zařízení, zavolejte SetLayout(hdc, LAYOUT_RTL). Další informace najdete ve zmínce o kontextech zrcadlení zařízení, jež nejsou spojeny s okny, která přichází později v tomto tématu.
Rastrové obrázky a ikony v zrcadleném okně se ve výchozím nastavení zrcadlí. Ne všechny by ale měly být zrcadlené. Například ty s textem, obchodním logem nebo analogovými hodinami by neměly být zrcadlené. Chcete-li zakázat zrcadlení rastrových obrázků, zavolejte SetLayout s bitem LAYOUT_BITMAPORIENTATIONPRESERVED v dwLayout. Chcete-li zakázat zrcadlení v DC, zavolejte SetLayout(hdc, 0).
Pokud chcete dotazovat aktuální výchozí rozložení, zavolejte GetProcessDefaultLayout. Po úspěšném návratu pdwDefaultLayout obsahuje LAYOUT_RTL nebo 0. Pokud chcete dotazovat nastavení rozložení kontextu zařízení, zavolejte GetLayout. Po úspěšném dokončení funkce vrátí GetLayout hodnotu DWORD, která označuje nastavení rozvržení pomocí bitů LAYOUT_RTL a LAYOUT_BITMAPORIENTATIONPRESERVED.
Po vytvoření okna změníte rozložení pomocí funkce SetWindowLong. To je třeba v případě, že uživatel změní jazyk uživatelského rozhraní existujícího okna z arabštiny nebo hebrejštiny na němčinu. Při změně rozložení existujícího okna však musíte okno zneplatnit a aktualizovat, aby se zajistilo, že obsah okna bude nakreslen ve stejném rozložení. Následující příklad kódu pochází z ukázkového kódu, který podle potřeby změní rozložení okna:
// Using ANSI versions of GetWindowLong and SetWindowLong because Unicode
// is not needed for these calls
lExStyles = GetWindowLongA(hWnd, GWL_EXSTYLE);
// Check whether new layout is opposite the current layout
if (!!(pLState -> IsRTLLayout) != !!(lExStyles & WS_EX_LAYOUTRTL))
{
// the following lines will update the window layout
lExStyles ^= WS_EX_LAYOUTRTL; // toggle layout
SetWindowLongA(hWnd, GWL_EXSTYLE, lExStyles);
InvalidateRect(hWnd, NULL, TRUE); // to update layout in the client area
}
Při zrcadlení byste měli uvažovat o "blízké" a "daleko" místo "vlevo" a "vpravo". Pokud to neuděláte, může to způsobit problémy. Jedním z běžných programovacích postupů, který způsobuje problémy v zrcadleném okně, je mapování mezi souřadnicemi obrazovky a klientskými souřadnicemi. Například aplikace často používají kód podobný následujícímu k umístění ovládacího prvku v okně:
// DO NOT USE THIS IF APPLICATION MIRRORS THE WINDOW
// get coordinates of the window in screen coordinates
GetWindowRect(hControl, (LPRECT) &rControlRect);
// map screen coordinates to client coordinates in dialog
ScreenToClient(hDialog, (LPPOINT) &rControlRect.left);
ScreenToClient(hDialog, (LPPOINT) &rControlRect.right);
To způsobuje problémy se zrcadlením, protože levý okraj obdélníku se změní na pravý okraj v zrcadleném okně a naopak. Chcete-li se tomuto problému vyhnout, nahraďte volání ScreenToClient voláním MapWindowPoints následujícím způsobem:
// USE THIS FOR MIRRORING
GetWindowRect(hControl, (LPRECT) &rControlRect);
MapWindowPoints(NULL, hDialog, (LPPOINT) &rControlRect, 2)
Tento kód funguje, protože na platformách, které podporují zrcadlení, je MapWindowPoints upravena tak, že při zrcadlení klientského okna přehodí souřadnice levého a pravého bodu. Další informace naleznete v části Poznámky MapWindowPoints.
Dalším běžným postupem, který může způsobit problémy se zrcadlenými okny, je umístění objektů v klientském okně pomocí posunů v souřadnicích obrazovky místo souřadnic klienta. Například následující kód používá rozdíl v souřadnicích obrazovky jako pozici x v souřadnicích klienta k umístění ovládacího prvku v dialogovém okně.
// OK if LTR layout and mapping mode of client is MM_TEXT,
// but WRONG for a mirrored dialog
RECT rdDialog;
RECT rcControl;
HWND hControl = GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hDlg, &rcDialog); // gets rect in screen coordinates
GetWindowRect(hControl, &rcControl);
MoveWindow(hControl,
rcControl.left - rcDialog.left, // uses x position in client coords
rcControl.top - rcDialog.top,
nWidth,
nHeight,
FALSE);
Tento kód je v pořádku, když má okno dialogového okna rozložení zleva doprava (LTR) a režim mapování klienta je MM_TEXT, protože nová pozice x v souřadnicích klienta odpovídá rozdílu v levých hranách ovládacího prvku a dialogu v souřadnicích obrazovky. V zrcadleném dialogovém okně jsou však obrácené doleva a doprava, takže místo toho byste měli použít MapWindowPoints následujícím způsobem:
RECT rcDialog;
RECT rcControl;
HWND hControl - GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hControl, &rcControl);
// MapWindowPoints works correctly in both mirrored and non-mirrored windows.
MapWindowPoints(NULL, hDlg, (LPPOINT) &rcControl, 2);
// Now rcControl is in client coordinates.
MoveWindow(hControl, rcControl.left, rcControl.top, nWidth, nHeight, FALSE)
Zrcadlení dialogových oken a polí zpráv
Dialogová okna a pole zpráv nedědí rozložení, takže musíte rozložení nastavit explicitně. Chcete-li zrcadlit okno zprávy, zavolejte MessageBox nebo MessageBoxEx s možností MB_RTLREADING. Chcete-li rozložení dialogového okna zprava doleva, použijte rozšířený styl WS_EX_LAYOUTRTL ve struktuře šablon dialogového okna DLGTEMPLATEEX. Seznamy vlastností jsou zvláštním případem dialogových oken. Každá záložka se považuje za samostatné dialogové okno, takže do každé záložky, kterou chcete zrcadlit, je třeba zahrnout styl WS_EX_LAYOUTRTL.
Zrcadlení kontextů zařízení nepřidružených k oknu
Zařízení DC, která nejsou přidružena k oknu, jako například metasoubor nebo DC tiskárny, nedědí rozložení, takže je nutné rozložení nastavit explicitně. Pokud chcete změnit rozložení kontextu zařízení, použijte funkci SetLayout.
Funkce SetLayout se zřídka používá s okny. Okna obvykle obdrží přidružený řadič domény pouze při zpracování WM_PAINT zprávy. Někdy program vytvoří řadič domény pro okno voláním GetDC. V obou směrech je počáteční rozložení řadiče domény nastaveno BeginPaint nebo GetDC podle příznaku WS_EX_LAYOUTRTL okna.
Hodnoty vrácené GetWindowOrgEx, GetWindowExtEx, GetViewportOrgEx a GetViewportExtEx nejsou ovlivněny voláním SetLayout.
Pokud je rozložení RTL, GetMapMode místo MM_TEXT vrátí MM_ANISOTROPIC. Volání SetMapMode s MM_TEXT bude fungovat správně; Ovlivněna je pouze návratová hodnota z GetMapMode. Podobně volání SetLayout(hdc, LAYOUT_RTL) při mapovacím režimu MM_TEXT způsobí, že se ohlášený režim mapování změní na MM_ANISOTROPIC.
Zničení okna
Obecně platí, že aplikace musí zničit všechna okna, která vytvoří. Dělá to pomocí funkce DestroyWindow. Když je okno zničeno, systém skryje okno, pokud je viditelné, a pak odebere veškerá interní data přidružená k oknu. Tím se zneplatní popisovač okna, který aplikace už nemůže používat.
Aplikace zničí mnoho oken, která vytvoří brzy po jejich vytvoření. Aplikace například obvykle zničí okno dialogového okna, jakmile má aplikace dostatečný vstup od uživatele, aby pokračovala ve své úloze. Aplikace nakonec zničí hlavní okno aplikace (před ukončením).
Před zničením okna by aplikace měla uložit nebo odebrat všechna data spojená s oknem a měla by uvolnit všechny systémové prostředky přidělené pro toto okno. Pokud aplikace prostředky neuvolní, systém uvolní všechny prostředky, které nebyly uvolněny aplikací.
Zničení okna nemá vliv na třídu okna, ze které je okno vytvořeno. Pomocí této třídy lze vytvářet nová okna a všechna existující okna této třídy budou nadále fungovat. Zničení okna také zničí okna nacházející se pod ním. Funkce DestroyWindow odešle nejprve do okna zprávu WM_DESTROY a potom do podřízených oken a následnických oken. Tímto způsobem jsou také zničena všechna podřízená okna okna, které se likviduje.
Okno s nabídkou okna obdrží WM_CLOSE zprávu, když uživatel klikne na Zavřít. Při zpracování této zprávy může aplikace před zničením okna vyzvat uživatele k potvrzení. Pokud uživatel potvrdí, že by mělo být okno zničeno, může aplikace volat funkci DestroyWindow zničit okno.
Pokud je ničeno aktivní okno, přenesou se aktivní i fokusové stavy do jiného okna. Okno, které se stane aktivním oknem, je další okno určené kombinací kláves ALT+ESC. Nové aktivní okno pak určuje, které okno obdrží fokus klávesnice.