更新时间:2015-10-16 15:51:29浏览次数:1+次
typedef WORD ATOM;//BUGBUG - might want to remove this from minwin
typedef unsigned short WORD;
对于ATOM,没有找到直接的解释,但是我们通过在VS中查看定义,可以看到这个类型是这么定义的。ATOM时友WORD类型重定义的,而WORD是由unsigned short类型重定义的,所以根本上,ATOM就是unsigned short类型的。然而注释中却标注BUGBUG,并解释说可能将这个类型从minWin系统版本中移除。
CreateWindow,CreateWindowEx,GetClassInfo,GetClassInfoEx, FindWindow, FindWindowEx,UnregisterClass 和 IActiveIMMap::FilterClientWindows方法中。
使用的地方,其实都是和窗口窗口类有关,而窗口类也就是用于这些地方。因为注册窗口类返回的ATOM值就代表关联了唯一的窗口类信息,可以说,就是注册窗口类后再窗口类信息列表中的一个索引值(序号)。我们来看一下MAKEINTRESOURCE定义:
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
#ifdef UNICODE
#define MAKEINTRESOURCE MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE MAKEINTRESOURCEA
#endif // !UNICODE
它也是和其他Windows函数一样有两个版本,一个Unicode版本和ANSI版本。从声明的类型中可以看到,最后一个i表示传入的参数,被强转为WORD类型,然后再转成ULONG_PTR,然后再转成了字符串类型返回。
typedef _W64 unsigned long ULONG_PTR;
它也是一个整型类型,不过会根据系统的版本来决定具体的长度。我们可以看到,从转到WORD,再到ULONG_PTR类型,实际上就是做一个数据位数的处理,然后到LPWSTR或者LPSTR,则从整型类型变成了字符指针类型。而在这个过程中,就将一个整型的资源ID变成了字符串指针类型。而从WORD长度的ATOM值到字符串地址的转换,我们可以看到,ATOM其实就是窗口类名称字符串的地址了。而这个地址通过WORD类型这个长度就可以找到了。如下图所示:
CreateWindow(MAKEINTRESOURCE(atomCls), L"主窗口_C++技术网", WS_OVERLAPPEDWINDOW , 100, 100, 600, 600, NULL, NULL, hInstance, NULL);
而我们要使用GetClassLong来获取窗口类,就是获取窗口类的ATOM类型的ID。那么如果使用获取到的窗口类ID,上面已经讲过了。获取ATOM类型的窗口类ID代码如下:WORD wClsID = (WORD)GetClassLong(hwnd,GCW_ATOM);
因为ATOM是WORD类型的,返回的是DWORD类型,所以类型转换,不过默认复制,也是会默认转换的。ATOM类型的窗口类ID就对应的注册窗口类的窗口类名称,窗口类结构体中的每一个成员都可以获取和修改。因为ATOM是大家所不熟悉的,前面也没有介绍,这里就花了很大的篇幅来详细介绍了。同时也详细介绍了INT资源ID转换宏MAKEINTRESOURCE的定义和使用方法。
如果你有任何问题,请留言。鉴于本人水平有限,如果发现问题,请指出,共同学习。