Win32 SDK基本(六)之详解窗口类的查找历程和相干API【Windows】,Win32,窗口类,相关API

Win32 SDK基本(六)之详解窗口类的查找历程和相干API【Windows】,Win32,窗口类,相关API

一、窗口类的查找历程

上一文中,我们引见了windows体系三种窗口类——体系窗口类、全局窗口类和部分窗口类。每种窗口类在操作体系中的作用域差别,而且每一个作用域内注册的窗口类称号是不能反复的。而建立窗口时每每会在体系、全局、部分局限依据窗口类称号举行寻觅,寻觅历程总结以下:

(1)操作体系依据传入的窗口类称号,如今部分窗口类中举行查找,假如找到实行第2步,假如未找到实行第3步。

(2)比较部分窗口类和建立窗口时传入的HINSTANCE变量。假如发明相称,申明建立和注册的窗口在同一个模块,建立窗口返回。假如不相称,继承实行第3步。

(3)在应用程序全局窗口类中举行查找,假如找到,实行第4步,假如未找到实行第5步。

(4)运用找到的窗口类的信息,建立窗口并返回。

(5)在体系窗口类中查找,假如找到就建立窗口,未找到就是建立窗口失利。

二、注册窗口类的API RegisterClass和RegisterClassEx

RegisterClass和RegisterClassEx都能用于注册窗口类,他们两个的原型离别以下:

ATOM WINAPI RegisterClass(
  _In_ const WNDCLASS *lpWndClass
);
ATOM WINAPI RegisterClassEx(
  _In_ const WNDCLASSEX *lpwcx
);

API原型上看能够看出,两者的区分重要在于吸收的参数上,这个参数就是我们须要注册的窗口类。这两个窗口类声明以下:

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;
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;

从上面的代码能够看到,两个窗口类构造体的重要区分在于WNDCLASSEX含有cbSize窗口的构造体大小和hIconSm窗口的小图标句柄。其他参数的寄义请自行参考MSDN

三、猎取已注册的窗口信息GetClassInfo

GetClassInfo() API能够猎取已注册的窗口的信息,其函数原型以下:

BOOL WINAPI GetClassInfo(
  _In_opt_ HINSTANCE  hInstance,
  _In_     LPCTSTR    lpClassName,
  _Out_    LPWNDCLASS lpWndClass
);

hInstance—— 是设置查找的作用域,假如设为NULL,会从体系、全局和部分三个作用域查找。

lpClassName —— 是要查找的窗口类称号。

lpWndClass —— 传入的WndClass构造体变量的地点,用于吸收窗口类信息。

我们来查找上文建立的Button类的窗口信息:

WNDCLASS wc;
if (GetClassInfo(NULL, "Button", &wc) == false)
MessageBox(NULL,"GetClassInfo Faile",NULL,NULL);

我们来经由过程设置断点,检察猎取的Button窗口类的信息:

四、卸载窗口类UnregisterClass

我们能够经由过程UnregisterClass能够将已注册的窗口类举行卸载,其原型以下:

BOOL WINAPI UnregisterClass(
  _In_     LPCTSTR   lpClassName,
  _In_opt_ HINSTANCE hInstance
);

lpClassName —— 是要卸载的窗口类称号。

hInstance —— 是设置查找的作用域,假如设为NULL,会从体系、全局和部分三个作用域查找。

以下代码,将注册的Button窗口类举行卸载:

 if (UnregisterClass("Button",NULL) == false)
MessageBox(NULL, "UnregisterClass Faile", NULL, NULL);

以上就是Win32 SDK基本(六)之详解窗口类的查找历程和相干API的细致内容,更多请关注ki4网别的相干文章!

分享到 :