Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Każde okno jest elementem członkowskim określonej klasy okna. Klasa okna określa domyślną procedurę okna używaną przez poszczególne okna do przetwarzania komunikatów. Wszystkie okna należące do tej samej klasy używają tej samej domyślnej procedury okna. Na przykład system definiuje procedurę okna dla klasy pola kombi (COMBOBOX); wszystkie pola kombi następnie używają tej procedury okna.
Aplikacja zazwyczaj rejestruje co najmniej jedną nową klasę okien i skojarzona z nią procedurę okna. Po zarejestrowaniu klasy aplikacja może utworzyć wiele okien tej klasy, z których wszystkie korzystają z tej samej procedury okna. Ponieważ oznacza to, że kilka źródeł może jednocześnie wywołać ten sam fragment kodu, musisz być ostrożny podczas modyfikowania współdzielonych zasobów z procedury okna. Aby uzyskać więcej informacji, zobacz Klasy okien .
Procedury okien dla okien dialogowych (nazywane procedurami okna dialogowego) mają podobną strukturę i działają jak zwykłe procedury okien. Wszystkie punkty odwołujące się do procedur okien w tej sekcji mają również zastosowanie do procedur okna dialogowego. Aby uzyskać więcej informacji, zobacz okna dialogowe .
W tej sekcji omówiono następujące tematy.
- Struktura procedury okna
- Default Window Procedure
- Podklasowanie (tworzenie podklasy) procedury okna
- Window Procedure Superclassing
Struktura procedury okna
Procedura okna to funkcja, która ma cztery parametry i zwraca wartość ze znakiem. Parametry obejmują uchwyt okna, identyfikator komunikatu UINT oraz dwa parametry komunikatów zadeklarowane za pomocą typów danych WPARAM i LPARAM. Aby uzyskać więcej informacji, zobacz WindowProc.
Parametry komunikatu często zawierają informacje zarówno w wyrazach o niskiej kolejności, jak i wysokiej kolejności. Istnieje kilka makr, których aplikacja może użyć do wyodrębnienia informacji z parametrów komunikatu. Makro LOWORD, na przykład wyodrębnia wyraz o niskiej kolejności (bity od 0 do 15) z parametru komunikatu. Inne makra obejmują HIWORD, LOBYTEi HIBYTE makro.
Interpretacja wartości zwracanej zależy od konkretnego komunikatu. Zapoznaj się z opisem każdego komunikatu, aby określić odpowiednią wartość zwracaną.
Ponieważ można wywołać procedurę okna rekursywnie, ważne jest zminimalizowanie liczby zmiennych lokalnych, których używa. Podczas przetwarzania poszczególnych komunikatów aplikacja powinna wywoływać funkcje poza procedurą okna, aby uniknąć nadmiernego użycia zmiennych lokalnych, co może spowodować przepełnienie stosu podczas głębokiej rekursji.
Domyślna procedura okna
Domyślna funkcja procedury okna DefWindowProc definiuje pewne podstawowe zachowanie współużytkowane przez wszystkie okna. Domyślna procedura okna zapewnia minimalną funkcjonalność okna. Procedura okna zdefiniowanego przez aplikację powinna przekazać wszystkie komunikaty, które nie są przetwarzane do funkcji DefWindowProc na potrzeby przetwarzania domyślnego.
Podklasowanie procedury systemowej okna
Gdy aplikacja tworzy okno, system przydziela blok pamięci do przechowywania informacji specyficznych dla okna, w tym adresu procedury okna, która przetwarza komunikaty dla okna. Gdy system musi przekazać komunikat do okna, przeszukuje informacje specyficzne dla okna w celu znalezienia adresu procedury okna i przekazuje komunikat do tej procedury.
Subclassing to technika, która pozwala aplikacji przechwytywać i przetwarzać komunikaty wysyłane lub przekazywane do określonego okna, zanim ma ono szansę je przetworzyć. Po sklasyfikowaniu okna aplikacja może rozszerzyć, zmodyfikować lub monitorować zachowanie okna. Aplikacja może podklasować okno należące do klasy globalnej systemu, takie jak kontrolka edycji lub pole listy. Na przykład aplikacja może podklasować kontrolkę edycji, aby uniemożliwić kontrolce akceptowanie niektórych znaków. Nie można jednak podklasować okna ani klasy należącej do innej aplikacji. All subclassing must be performed within the same process.
Aplikacja tworzy podklasę okna, zastępując adres oryginalnej procedury okna adresem nowej procedury okna, nazywanej procedurą podklasy . Następnie procedura podklasy odbiera wszystkie wiadomości wysłane lub zamieszczone w oknie.
Procedura podklasy może wykonać trzy akcje po otrzymaniu komunikatu: może przekazać komunikat do oryginalnej procedury okna, zmodyfikować komunikat i przekazać go do oryginalnej procedury okna lub przetworzyć komunikat i nie przekazać go do oryginalnej procedury okna. Jeśli procedura podklasy przetwarza komunikat, może to zrobić przed, po lub zarówno przed, jak i po przekazaniu komunikatu do oryginalnej procedury okna.
The system provides two types of subclassing: instance and global. W subklasowaniu instancji aplikacja zastępuje adres procedury okna dla pojedynczej instancji okna. Aplikacja musi używać dziedziczenia instancji, aby tworzyć podklasę istniejącego okna. W globalnym podklasowaniu aplikacja zastępuje adres procedury okna w strukturze WNDCLASSEX klasy okna. Wszystkie kolejne okna utworzone za pomocą klasy mają adres procedury podklasy, ale nie ma to wpływu na istniejące okna klasy.
Podklasy instancji
Aplikacja tworzy podklasę wystąpienia okna przy użyciu funkcji 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 podklasy może znajdować się w pliku wykonywalnym aplikacji lub w pliku DLL.
When passed the GWL_WNDPROC flag, SetWindowLongPtr returns the address of the window's original window procedure. Aplikacja musi zapisać ten adres, używając go w kolejnych wywołaniach funkcji CallWindowProc, aby przekazać przechwycone komunikaty do oryginalnej procedury okna. Aplikacja musi również mieć oryginalny adres procedury okna, aby usunąć podklasę z okna. 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.
System jest właścicielem klas globalnych systemu, a aspekty kontrolek mogą ulec zmianie z jednej wersji systemu na następną. Jeśli aplikacja musi podklasować okno należące do klasy globalnej systemu, deweloper może potrzebować zaktualizować aplikację po wydaniu nowej wersji systemu.
Ponieważ podklasowanie wystąpienia występuje po utworzeniu okna, nie można dodać żadnych dodatkowych bajtów do okna. Aplikacje, które podklasują okno, powinny używać listy właściwości okna do przechowywania wszelkich danych potrzebnych dla wystąpienia okna podklasyfikowanego. For more information, see Window Properties.
Gdy aplikacja podklasuje okno już podklasowane, musi usunąć podklasy w odwrotnej kolejności, w jakiej zostały utworzone. Jeśli kolejność usuwania nie zostanie odwrócona, może wystąpić nieodwracalny błąd systemu.
Podklasy globalne
To globally subclass a window class, the application must have a handle to a window of the class. The application also needs the handle to remove the subclass. Aby uzyskać uchwyt, aplikacja zazwyczaj tworzy ukryte okno klasy, która ma być podklasą. 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 zwraca adres oryginalnej procedury okna dla klasy.
Oryginalny adres procedury okna jest używany w podklasie globalnej w taki sam sposób, jak w podklasach wystąpień. Procedura podklasy przekazuje komunikaty do oryginalnej procedury okna, wywołując CallWindowProc. Aplikacja usuwa podklasę z klasy okna, ponownie wywołując SetClassLongPtr i określając adres oryginalnej procedury okna, flagę GCL_WNDPROC oraz uchwyt do okna klasy, której utworzono podklasę. Aplikacja, która globalnie podklasuje klasę sterowania, musi usunąć podklasę po zakończeniu działania aplikacji; w przeciwnym razie może wystąpić nieodwracalny błąd systemu.
Podklasy globalne mają takie same ograniczenia jak podklasy instancji, jak również pewne dodatkowe restrykcje. Aplikacja nie powinna używać dodatkowych bajtów dla klasy lub wystąpienia okna, nie wiedząc dokładnie, jak używa ich oryginalna procedura okna. Jeśli aplikacja musi skojarzyć dane z oknem, powinna używać właściwości 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. Superklasa jest oparta na istniejącej klasie okien o nazwie klasy bazowej. Często klasa bazowa jest systemową globalną klasą okien, taką jak kontrolka edycji, ale może to być dowolna klasa okna.
Klasa nadrzędna ma własną procedurę okienną, nazywaną procedurą klasy nadrzędnej. Procedura superklasy może wykonać trzy akcje po otrzymaniu komunikatu: może przekazać komunikat do oryginalnej procedury okna, zmodyfikować komunikat i przekazać go do oryginalnej procedury okna lub przetworzyć komunikat i nie przekazać go do oryginalnej procedury okna. Jeśli procedura z klasy nadrzędnej przetwarza wiadomość, może to zrobić przed, po lub zarówno przed, jak i po przekazaniu wiadomości do oryginalnej procedury okna.
W przeciwieństwie do procedury podklasy, procedura superklasy może przetwarzać komunikaty tworzenia okien (WM_NCCREATE, WM_CREATEitd.), ale musi również przekazać je do oryginalnej procedury okna klasy bazowej, aby procedura okna klasy bazowej mogła wykonać procedurę inicjowania.
Aby zastąpić klasę okien, aplikacja najpierw wywołuje funkcję GetClassInfoEx w celu pobrania informacji o klasie bazowej. GetClassInfoEx wypełnia strukturę WNDCLASSEX wartościami z struktury WNDCLASSEX klasy bazowej. Next, the application copies its own instance handle into the hInstance member of the WNDCLASSEX structure and copies the name of the superclass into the lpszClassName member. Jeśli klasa bazowa posiada menu, aplikacja musi zapewnić nowe menu z tymi samymi identyfikatorami menu i skopiować nazwę menu do członka lpszMenuName. Jeśli procedura superklasy przetwarza komunikat WM_COMMAND i nie przekazuje go do procedury okna klasy bazowej, menu nie musi mieć odpowiednich identyfikatorów. GetClassInfoEx does not return the lpszMenuName, lpszClassName, or hInstance member of the WNDCLASSEX structure.
Aplikacja musi również ustawić członka lpfnWndProc struktury WNDCLASSEX. Funkcja GetClassInfoEx wypełnia to pole adresem oryginalnej procedury okna danej klasy. 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. Aplikacja może, jeśli to konieczne, modyfikować dowolnych innych członków struktury WNDCLASSEX. Po wypełnieniu struktury WNDCLASSEX aplikacja rejestruje superklasę, przekazując adres struktury do funkcji RegisterClassEx. The superclass can then be used to create windows.
Because superclassing registers a new window class, an application can add to both the extra class bytes and the extra window bytes. Superklasa nie może używać oryginalnych dodatkowych bajtów dla klasy bazowej lub okna z tych samych powodów, dla których podklasa instancji lub podklasa globalna nie powinna ich używać. Also, if the application adds extra bytes for its use to either the class or the window instance, it must reference the extra bytes relative to the number of extra bytes used by the original base class. Ponieważ liczba bajtów używanych przez klasę bazową może się różnić od jednej wersji klasy bazowej do następnej, przesunięcie początkowe dla własnych dodatkowych bajtów superklasy może również różnić się od jednej wersji klasy bazowej do następnej.