众所周知 , 我们会使用RegisterClass和RegisterClassEx这两个函数来注册窗口类 。 有细心的人注意到了 , 它们的返回值是一个ATOM类型 。 那么 , 它的作用是什么呢?
对于所有已注册的窗口类来说 , 它们的名称都保留在一个USER32模块内部的ATOM表格中 。 上述函数返回的就是这个ATOM值 。 如果你想获取一个窗口类的ATOM , 可以调用GetClassWord(hwnd GCW_ATOM) 。
有一些函数会接受一个窗口类的名称或者ATOM值 , 则我们可以使用MAKEINTATOM这个宏来将一个整数型ATOM转换为预期的类型 。 最普遍的情况是CreateWindowEx函数中的lpClassName这个参数 。 另外 , 你可以可以在GetClassInfo和GetClassInfoEx这两个函数的lpClassName参数中使用到ATOM 。 (其实 , 我不明白你为什么要这样做 。 为什么呢?为了首先将ATOM传递给 GetClassInfo , 你必须注册该类才能获取到对应的ATOM , 在这种情况下 , 你为什么还要获取关于窗口类的信息呢?毕竟 , 这个窗口类就是你自己设计的)
为了将一个窗口类名称转换为类ATOM , 你可以创建一个基于这个窗口类的测试窗口 , 然后调用之前提到过的GetClassWord(hwnd GCW_ATOM)这个函数 。 或者 , 你也可以使用GetClassInfoEx , 它的返回值就是这个窗口类的ATOM值 , 请注意它的BOOL类型的返回值可以直接转换为ATOM类型 。 后一种方法可以避免创建测试窗口 , 但要注意 , 在基于Windows 95的系统上 , GetClassInfoEx的返回值不是窗口类的ATOM 。 别搞混了 。
但是 , 你可能会问了 , 这个ATOM到底有什么好 , 为什么要使用它呢?
【bilibili|说说RegisterClass这个函数返回值的作用】实际上 , 它也没什么好的 。 使用ATOM , 可以使你不必将字符串传递给 CreateWindow 等函数 , 但它所做的只是用整数替换字符串 , 你必须将其保存在全局变量中以备后用 。 以前需要在代码中硬编码的字符串 , 现在就可以使用ATOM来进行追踪 。 我不大确定这种做法为开发者带来了多大的好处 。
我想 , 你可以用它来快速检查一个窗口是否属于一个特定的窗口类 。首先获得该类的ATOM(例如通过 GetClassInfo函数) , 然后获得窗口的ATOM并比较它们 。但是你不能缓存这个ATOM , 因为类可能会被取消注册然后重新注册(这会给它一个新的ATOM值) 。并且你不能预取ATOM , 因为在你预取它时该类可能尚未注册 。 (并且如上所述 , 无论如何你都无法缓存预取值 。 ) 因此 , 无论如何 , 这种情况几乎是不可能的; 你也可以使用 GetClassName 函数并将生成的类名与您要查找的类进行比较 。
换句话说 , 窗口类的ATOM已经有点过时了 。 它有点像replacement dialog box 类 , 这些类并没有得到开发者的广泛使用 , 但是为了保持兼容性 , 操作系统还是会带上对它们的支持 。
虽然ATOM没有什么特别大的用处 , 但通过本文 , 你至少知道这个ATOM是啥玩意儿了 。
总结依小弟之见 , 能理解ATOM的原理 , 也算是进入到Windows SDK编程的Level 2了
(总共 Level 10) 。
各位请慢慢求索 。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《What’s the atom returned by RegisterClass useful for?》
- iPhone|第一次用苹果手机是什么样的感觉?用了十年苹果手机,说说感受
- 德尔塔|从新冠病毒最新变种Omicron说说我的经历
- bilibili|B站,故事越来越难讲
- bilibili|这种智能手表,谁能不爱?
- bilibili|蹭热点还是真升级 天下秀“全员虹宇宙”为哪般??
- bilibili|B站35岁副总裁嫁24岁UP主,身价80亿,3次创业成为人生赢家
- bilibili|被公司监控的互联网人:打开听歌APP被警告、不敢跟朋友聊微信
- 双十一|盘点我心中的今年双十一最超值的10款数码产品,说说你都买了啥
- bilibili|“网抑云”们,网易云音乐要上市了【财报排行榜】
- 耳机|动铁耳机和动圈耳机哪种更好?玩了6年耳机,给您说说