首页  >   经验  >   Windows零基础入门:4.7 获取窗口类ID与注册窗口类返回的ID相互验证

Windows零基础入门:4.7 获取窗口类ID与注册窗口类返回的ID相互验证

查看 codexia 的博客 2015-12-05 19:34:53 2101 会员文章,禁止转载
Windows   入门  
手机阅读 | 转发赚积分
手机收藏 | 分享给好友
简介本节课就是验证通过注册窗口类函数RegisterClass返回的窗口类ID与GetClassLong函数返回的窗口类ID是否一致,以进一步巩固和确认注册窗口类的知识。在这个验证过程中,我们会遇见一个问题,平时大家不会关注,所以特别在这里展示一下。
    获取窗口类ID的方法,在《Windows零基础入门:4.2 获取窗口类信息之查询窗口类名称ID》已经讲述了。代码如下:
WORD wClsID = (WORD)GetClassLong(hwnd,GCW_ATOM);//WORD和ATOM类型一样
    而注册窗口类RegisterClass返回的就是这个窗口类ID,代码如下:
ATOM Class = RegisterClass(&wndClass);// - ATOM类型就是WORD类型
    而我们平常只检测RegisterClass返回值是否为NULL,如果为NULL则表示注册窗口类失败,否则就返回一个非零值,这个非零值其实就是注册成功的窗口类ID。
    实际上,注册返回的窗口类ID就是窗口类表中唯一标识窗口类的ID,与GetClassLong获取的应该一致。不过为了严谨,我们还是要写代码来验证。
    以下是完整的验证代码:
#include "windows.h"
#include <tchar.h>

LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
    TCHAR ClassName[] = _T("MyClass");
    TCHAR title[] = _T("title");
    WNDCLASS wndClass;
    wndClass.cbClsExtra=0;
    wndClass.cbWndExtra=0;
    wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndClass.hInstance = hInstance;
    wndClass.lpfnWndProc = WinProc;
    wndClass.lpszClassName = ClassName;
    wndClass.lpszMenuName=NULL;
    wndClass.style=CS_HREDRAW|CS_VREDRAW;

    ATOM Class = RegisterClass(&wndClass);// - ATOM类型就是WORD类型
    if(!Class)
    {
        return 0;
    }

    HWND hwnd = CreateWindow(ClassName,title,WS_OVERLAPPEDWINDOW,0,0,100,100,NULL,NULL,hInstance,NULL);
    DWORD Atom = GetClassLong(hwnd,GCW_ATOM);
    if(Class==Atom)
    {
        MessageBox(hwnd,_T("注册窗口类的窗口类ID和通过GetClassLong获取的窗口类ID是一致的"),_T("tip"),0);
    }
}
    你可以运行看看,但是会发现一个问题,那就是,这两个得到的窗口类ID竟然不相同。因为没有弹出这个消息框提示一致。难道是我们理解的有问题??
    然后仔细检查代码,似乎没有什么问题啊,是不是很郁闷。
    这个时候,我们就要发挥调试技巧了。然后从头到尾来排除一下,当然,只需要先在关键点来排除就可以了。那么,关键点就是注册窗口类、创建窗口和获取窗口类ID。我们分别在这个三个地方打上断点:将光标单击在对应的行,然后按F9,就可在这一行打上断点。打上断点后,就在这一行最左边看到一个大大的原点。然后按F5启动调试。当然,如果代码短,就只在第一个关键位置打一个断点,然后单步执行完就可以了。
   
开通会员付1C币>>阅读全文
标注
评论
站内搜
百度搜
传送到手机
手机扫码,识别文字,完成传送x
加载中...
标注内容x
加载中...
添加标注x
收藏 0 点赞 0
公众号
微信赞赏
支付宝赞赏
领支付宝大红包
QQ群

相关阅读

分享到:
分享文章[Windows零基础入门:4.7 获取窗口类ID与注册窗口类返回的ID相互验证]到QQ空间

Win32课程菜单

猜您感兴趣