Maison  >  Article  >  Opération et maintenance  >  Bases du SDK Win32 (6) Explication détaillée du processus de recherche de classe de fenêtre et des API associées

Bases du SDK Win32 (6) Explication détaillée du processus de recherche de classe de fenêtre et des API associées

黄舟
黄舟original
2017-06-06 09:44:402342parcourir

1. Le processus de recherche des classes de fenêtres

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.

2. Enregistrez la classe de fenêtreAPI RegisterClass et RegisterClassEx RegisterClass et RegisterClassEx

🎜> 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ée

GetClassInfoL'API GetClassInfo()peut

obtenir la fenêtre enregistrée information Les informations de la fenêtre, sa

fonction prototype est la suivante : hInstance

—— sert à définir la portée de la recherche, si elle est définie sur
BOOL 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 structure

WndClass

transmise, utilisée pour recevoir les informations de classe de fenêtre. Trouvons les informations de la fenêtre de la classe

Button

créée ci-dessus :

Configurons-le Breakpoint , vérifiez les informations obtenues de la classe de fenêtre
WNDCLASS wc;
if (GetClassInfo(NULL, "Button", &wc) == false)
MessageBox(NULL,"GetClassInfo Faile",NULL,NULL);
Button

 : 4

Désinstaller la classe de fenêtre

UnregisterClass<.> Nous pouvons désenregistrer la classe de fenêtre enregistrée via UnregisterClass. Son prototype est le suivant :

lpClassName - est le nom de la classe de fenêtre à désinstaller.

hInstance
BOOL 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn