意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

说说RegisterClass这个函数返回值的作用

来源:恒创科技 编辑:恒创科技编辑部
2024-01-29 20:44:59


众所周知,我们会使用RegisterClass和RegisterClassEx这两个函数来注册窗口类。有细心的人注意到了,它们的返回值是一个ATOM类型。那么,它的作用是什么呢?

对于所有已注册的窗口类来说,它们的名称都保留在一个USER32模块内部的ATOM表格中。上述函数返回的就是这个ATOM值。如果你想获取一个窗口类的ATOM,可以调用GetClassWord(hwnd, GCW_ATOM)。


说说RegisterClass这个函数返回值的作用

有一些函数会接受一个窗口类的名称或者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到底有什么好,为什么要使用它呢?

实际上,它也没什么好的。使用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?》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

说说RegisterClass这个函数返回值的作用_开发者

上一篇: 为什么设计一个单独的GetSystemDirectory函数? 下一篇: 手机怎么远程登录云服务器?