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.
Každé okno je členem konkrétní třídy okna. Třída okna určuje výchozí proceduru okna, kterou jednotlivá okna používá ke zpracování svých zpráv. Všechna okna patřící do stejné třídy používají stejnou výchozí proceduru okna. Systém například definuje proceduru okna pro třídu kombinovaného pole (COMBOBOX); všechna kombinovaná pole pak používají tuto proceduru okna.
Aplikace obvykle registruje alespoň jednu novou třídu okna a její přidruženou proceduru okna. Po registraci třídy může aplikace vytvořit mnoho oken této třídy, z nichž všechny používají stejný postup okna. Because this means several sources could simultaneously call the same piece of code, you must be careful when modifying shared resources from a window procedure. Další informace naleznete v tématu Třídy oken.
Procedury oken pro dialogová okna (nazývané postupy dialogového okna) mají podobnou strukturu a fungují jako běžné procedury okna. Všechny body odkazující na postupy oken v této části platí také pro postupy dialogového okna. Další informace naleznete v tématu Dialogová okna.
Tato část popisuje následující témata.
- struktura procedury okna
- Default Window Procedure
- Window Procedure Subclassing
- Window Procedure Superclassing
Struktura procedury okna
Procedura okna je funkce, která má čtyři parametry a vrací podepsanou hodnotu. Parametry se skládají z popisovače okna, identifikátoru zprávy UINT a dva parametry zprávy deklarované pomocí WPARAM a LPARAM datových typů. Další informace naleznete v tématu WindowProc.
Parametry zprávy často obsahují informace v jejich slovech s nízkým pořadím i ve slovech s vysokým pořadím. There are several macros an application can use to extract information from the message parameters. Makro LOWORD například extrahuje slovo s nízkým pořadím (bity 0 až 15) z parametru zprávy. Mezi další makra patří HIWORD, LOBYTEa HIBYTE.
Interpretace návratové hodnoty závisí na konkrétní zprávě. Projděte si popis každé zprávy a určete odpovídající návratovou hodnotu.
Protože je možné volat proceduru okna rekurzivně, je důležité minimalizovat počet místních proměnných, které používá. Při zpracování jednotlivých zpráv by aplikace měla volat funkce mimo proceduru okna, aby se zabránilo nadměrnému použití místních proměnných, což může způsobit přetečení zásobníkové paměti při hluboké úrovni rekurze.
Default Window Procedure
Výchozí funkce procedury okna, DefWindowProc definuje určité základní chování sdílené všemi okny. Výchozí procedura okna poskytuje minimální funkce pro okno. Procedura okna definovaná aplikací by měla předat všechny zprávy, které nezpracová, do funkce DefWindowProc pro výchozí zpracování.
Window Procedure Subclassing
Když aplikace vytvoří okno, systém přidělí blok paměti pro ukládání informací specifických pro okno, včetně adresy okna procedury, která zpracovává zprávy pro okno. Když systém potřebuje předat zprávu do okna, vyhledá specifické informace o okně pro adresu procedury okna a předá zprávu této proceduře.
Podtřídění je technika, která umožňuje aplikaci zachytit a zpracovat zprávy odeslané nebo poslané do určitého okna předtím, než je okno má možnost zpracovat. Pokud je okno podtříděno, může aplikace rozšířit, upravit nebo monitorovat jeho chování. Aplikace může podtřídět okno, které patří do globální třídy systému, například ovládací prvek pro úpravy nebo seznam. For example, an application could subclass an edit control to prevent the control from accepting certain characters. Nemůžete však podtřídit okno nebo třídu, které patří do jiné aplikace. All subclassing must be performed within the same process.
An application subclasses a window by replacing the address of the window's original window procedure with the address of a new window procedure, called the subclass procedure. Thereafter, the subclass procedure receives any messages sent or posted to the window.
Procedura podtřídy může při přijetí zprávy provést tři akce: může předat zprávu do původní procedury okna, upravit zprávu a předat ji do původní procedury okna, nebo zprávu zpracovat a nepředá ji do původní procedury okna. If the subclass procedure processes a message, it can do so before, after, or both before and after it passes the message to the original window procedure.
Systém poskytuje dva typy podtřídy: instance a globální. V podtřídě instancenahradí aplikace adresu procedury okna jedné instance okna. Aplikace musí k podtřídě existujícího okna použít podtřídu instance. In global subclassing, an application replaces the address of the window procedure in the WNDCLASSEX structure of a window class. Všechna následná okna vytvořená pomocí třídy mají adresu podtřídové procedury, ale stávající okna třídy nejsou ovlivněna.
Instance Subclassing
Aplikace podtříduje okno pomocí funkce SetWindowLongPtr. The application passes the GWL_WNDPROC flag, the handle to the window to subclass, and the address of the subclass procedure to SetWindowLongPtr. Procedura podtřídy se může nacházet buď ve spustitelném souboru aplikace, nebo v knihovně DLL.
Při předání příznaku GWL_WNDPROC příkaz SetWindowLongPtr vrátí adresu původní procedury okna. Aplikace musí tuto adresu uložit a použít ji v následných voláních funkce CallWindowProc, aby předávala zachycené zprávy do původní procedury okna. The application must also have the original window procedure address to remove the subclass from the window. To remove the subclass, the application calls SetWindowLongPtr again, passing the address of the original window procedure with the GWL_WNDPROC flag and the handle to the window.
Systém vlastní globální třídy systému a aspekty ovládacích prvků se můžou změnit z jedné verze systému na další. If the application must subclass a window that belongs to a system global class, the developer may need to update the application when a new version of the system is released.
Vzhledem k tomu, že podtřída instance nastane po vytvoření okna, není možné do okna přidat žádné další bajty. Aplikace, které podtřídí okno, by měly použít seznam vlastností okna k uložení všech dat potřebných pro instanci podtříděného okna. Další informace naleznete v tématu Vlastnosti okna.
When an application subclasses a subclassed window, it must remove the subclasses in the reverse order they were performed. Pokud pořadí odebrání není obrácené, může dojít k neopravitelné systémové chybě.
Global Subclassing
To globally subclass a window class, the application must have a handle to a window of the class. Aplikace také potřebuje ovládací prvek k odebrání podtřídy. To get the handle, an application typically creates a hidden window of the class to be subclassed. After obtaining the handle, the application calls the SetClassLongPtr function, specifying the handle, the GCL_WNDPROC flag, and the address of the subclass procedure. SetClassLongPtr vrátí adresu původní procedury okna třídy.
Původní adresa procedury okna se používá u globálního podtřídění stejně jako u podtřídění instance. The subclass procedure passes messages to the original window procedure by calling CallWindowProc. The application removes the subclass from the window class by calling SetClassLongPtr again, specifying the address of the original window procedure, the GCL_WNDPROC flag, and the handle to a window of the class being subclassed. Aplikace, která globálně podtříduje třídu ovládacího prvku, musí při ukončení aplikace odebrat podtřídu; v opačném případě může dojít k neopravitelné systémové chybě.
Globální podtřídy mají stejná omezení jako podtřídy instancí a navíc některá další omezení. Aplikace by neměla používat nadbytečné bajty pro třídu nebo instanci okna, aniž by věděla, jak je původní procedura okna používá. Pokud aplikace musí přidružit data k oknem, měla by používat vlastnosti okna.
Window Procedure Superclassing
Superclassing is a technique that allows an application to create a new window class with the basic functionality of the existing class, plus enhancements provided by the application. Supertřída je založena na existující třídě okna, která se nazývá základní třídy. Základní třída je často systémovou globální třídou okna, jako je například ovládací prvek pro úpravy, ale může to být libovolná třída okna.
A superclass has its own window procedure, called the superclass procedure. Procedura nadtřídy může provést tři akce při přijetí zprávy: Může předat zprávu do původní procedury okna, upravit zprávu a předat ji původnímu postupu okna nebo zprávu zpracovat a nepředá ji do původní procedury okna. Pokud nadtřídní procedura zpracuje zprávu, může to udělat před, po, nebo jak před, tak i po jejím předání původní oknové proceduře.
Na rozdíl od procedury podtřídy může procedura supertřídy zpracovávat zprávy vytváření oken (WM_NCCREATE, WM_CREATEatd.), ale musí je také předat původní procedurě okna základní třídy, aby procedura okna základní třídy mohl provést její inicializační proceduru.
Pokud chce aplikace vytvořit nadtřídu z třídy okna, nejprve volá funkci GetClassInfoEx k načtení informací o základní třídě. GetClassInfoEx vyplní strukturu WNDCLASSEX hodnotami ze struktury WNDCLASSEX základní třídy. Dále aplikace zkopíruje svůj vlastní popisovač instance do člena hInstance struktury WNDCLASSEX a zkopíruje název supertřídy do člena lpszClassName. Pokud základní třída obsahuje nabídku, aplikace musí zajistit novou nabídku se stejnými identifikátory nabídky a zkopírovat název nabídky do členu lpszMenuName. Pokud procedura supertřídy zpracuje zprávu WM_COMMAND a nepředá ji do okna procedury základní třídy, nabídka nemusí mít odpovídající identifikátory. GetClassInfoEx nevrací lpszMenuName, lpszClassNamenebo hInstance člen WNDCLASSEX struktury.
Aplikace musí také nastavit člen lpfnWndProc ve struktuře WNDCLASSEX. Funkce GetClassInfoEx vyplní tohoto člena adresou původní procedury okna třídy. The application must save this address, to pass messages to the original window procedure, and then copy the address of the superclass procedure into the lpfnWndProc member. Aplikace může v případě potřeby upravit všechny ostatní členy struktury WNDCLASSEX. Jakmile aplikační program vyplní strukturu WNDCLASSEX, zaregistruje nadtřídu tak, že předá adresu této struktury funkci RegisterClassEx. The superclass can then be used to create windows.
Vzhledem k tomu, že přetěžování registruje novou třídu okna, může aplikace přidat jak dodatečné bajty třídy, tak i dodatečné bajty okna. Nadřazená třída nesmí používat původní nadbytečné bajty pro základní třídu nebo okno ze stejných důvodů jako podtřída instance nebo globální podtřída. Pokud aplikace přidá další bajty pro své použití do třídy nebo instance okna, musí odkazovat na nadbytečné bajty vzhledem k počtu nadbytečných bajtů používaných původní základní třídou. Vzhledem k tomu, že počet bajtů používaných základní třídou se může lišit od jedné verze základní třídy k dalšímu, počáteční posun pro vlastní nadbytečné bajty supertřídy se také může lišit od jedné verze základní třídy k další.