概述
众所周知,我们会使用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到底有什么好,为什么要使用它呢?
实际上,它也没什么好的。使用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这个函数返回值的作用总结最后最近我写了个东西的全部内容,希望文章能够帮你解决说说RegisterClass这个函数返回值的作用总结最后最近我写了个东西所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复