Maison >Opération et maintenance >exploitation et entretien des fenêtres >Bases du SDK Win32 (6) Explication détaillée du processus de recherche de classe de fenêtre et des API associées
Dans l'article précédent, nous avons présenté les trois classes de fenêtres du système windows - fenêtre système classe, classe de fenêtre globale et classe de fenêtre locale. Chaque classe de fenêtre a une portée différente dans le système d'exploitation et le nom de classe de fenêtre enregistré dans chaque portée ne peut pas être répété. Lors de la création d'une fenêtre, elle est souvent recherchée en fonction du nom de la classe de fenêtre dans les étendues système, globale et locale. Le processus de recherche est résumé comme suit :
(1) Le fonctionnement. Le système recherche le nom de la classe de fenêtre en fonction du nom de la classe de fenêtre entrante. Recherchez maintenant dans la classe de fenêtre locale. S'il est trouvé, exécutez l'étape 2. S'il n'est pas trouvé, exécutez l'étape 3<.>.
(2)Comparez la classe de fenêtre locale avec la variable HINSTANCE transmise lors de la création de la fenêtre. S'ils sont égaux, cela signifie que les fenêtres créées et enregistrées sont dans le même module, et la fenêtre créée est renvoyée. S'il n'est pas égal, continuez à l'étape 3.
(3)Recherchez dans la classe de fenêtre globale de l'application. Si trouvé, exécutez l'étape 4 S'il n'est pas trouvé, exécutez l'étape 5<.> étapes. (4) Utilisez les informations de classe de fenêtre trouvées pour créer une fenêtre et revenir.
(5) Rechercher dans la classe de fenêtre système. Si elle est trouvée, créez la fenêtre. Si elle n'est pas trouvée, la création de la fenêtre échoue.
🎜> peut être utilisé pour enregistrer des classes de fenêtres. Leurs deux prototypes sont les suivants :
ATOM WINAPI RegisterClass( _In_ const WNDCLASS *lpWndClass ); ATOM WINAPI RegisterClassEx( _In_ const WNDCLASSEX *lpwcx );
La différence réside principalement dans les paramètres reçus. Ce paramètre est la classe de fenêtre que nous devons enregistrer. Les deux classes de fenêtres sont déclarées comme suit :
typedef struct tagWNDCLASS { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; } WNDCLASS, *PWNDCLASS;Comme vous pouvez le voir dans le code ci-dessus, la principale différence entre les deux classes de fenêtres
typedef struct tagWNDCLASSEX { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; HICON hIconSm; } WNDCLASSEX, *PWNDCLASSEX;structure
is WNDCLASSEX contient la taille de la structure de la fenêtre cbSize et la petite poignée d'icône de la fenêtre hIconSm. Veuillez vous référer à MSDN pour la signification des autres paramètres. 3.
Obtenir les informations sur la fenêtre enregistréefonction prototype est la suivante : hInstance
—— sert à définir la portée de la recherche, si elle est définie surBOOL WINAPI GetClassInfo( _In_opt_ HINSTANCE hInstance, _In_ LPCTSTR lpClassName, _Out_ LPWNDCLASS lpWndClass );
NULL sera recherché à partir de trois étendues : système, globale et locale. lpClassName - est le nom de la classe de fenêtre à trouver.
lpWndClass - L'adresse de la variable de structureWndClass
transmise, utilisée pour recevoir les informations de classe de fenêtre. Trouvons les informations de la fenêtre de la classe
Buttoncréée ci-dessus :
Configurons-le Breakpoint , vérifiez les informations obtenues de la classe de fenêtreWNDCLASS wc; if (GetClassInfo(NULL, "Button", &wc) == false) MessageBox(NULL,"GetClassInfo Faile",NULL,NULL);Button
: 4
Désinstaller la classe de fenêtrelpClassName - est le nom de la classe de fenêtre à désinstaller.
hInstanceBOOL WINAPI UnregisterClass( _In_ LPCTSTR lpClassName, _In_opt_ HINSTANCE hInstance );—— consiste à définir la portée de recherche S'il est défini sur NULL
, la recherche sera effectuée à partir de trois portées : système, globale et locale. . Le code suivant désinstalle la classe de fenêtre Button
enregistrée :Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!