登录  /  注册

Win32 SDK基础(六)之详解窗口类的查找过程和相关API

黄舟
发布: 2017-06-06 09:44:40
原创
2213人浏览过

一、窗口类的查找过程

    上一文中,我们介绍了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的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号