您的位置:首页 > 其它

MFC框架 CWnd的执行介绍 窗口的创建过程

2020-05-11 04:08 267 查看

每一个HWND都对应一个 CWnd,由CHandleMap保存这个映射,使用CWnd::Attach(HWND)来添加映射,使用HWND Detach();来移除映射.CWnd有一个静态成员函数FromHandle,可以通过HWND返回对应的CWnd的对象。Attach是在创建这个窗口的时候调用的。

 

MFC框架 是把 所有的窗口的消息处理函数统一设置为一个AfxWndProc(),然后使用CWnd的静态成员函数获取对应的CWnd,然后分发消息,在此之前,统一用DefWindowProc填充lpfnWndProc结构。

在创建窗口的时候程序已经开始处理消息了。但是这时候的窗口消息函数还是DefWindowProc,我们会漏掉很多消息,因此要先安装一个钩子,拦截HCNT_CREATEWND消息,然后调用Attach(HWND)在这里设置窗口函数的地址SetWindowLong(hwnd,GWL_WNDPROC,AfxWndProc)。SetWindowHookEx的时候把钩子句柄保存到线程局部变量中,以备CallNextHookEx使用。

Hook()

CreateWindowEx()函数执行的时候钩子会被执行,

UnHook()

这样我们就可以通过一个全局的函数处理所有的消息了。

消息处理的时候,可以通过wparam lparam 处理,也可以通过线程的局部变量m_lastSendMsg。

proc()

{

     m_lastSendMsg=msg;

  处理消息()

   {

    通过线程局部变量m_lastSendMsg获得消息。。或者通过参数。

  }

}

 

最后就是Cwnd::CreateEx的实现了

{

 填充WNDCLASS结构CS

if(!PreCreateWindow(&CS))//用户可以重载这个函数,修改CS样式,如果不重载,只是把这个窗口类名修改为默认的_afxwnd,不然这个窗口类就会没有名字。

{

   执行失败返回 FALSE;

}

Hook();安装钩子

CreateWindowEx();

UnHook();

没问题 返回OK

}

转载于:https://www.cnblogs.com/IamHuskar/archive/2012/11/03/2752239.html

a1853081084 原创文章 0获赞 0访问量 129 关注 私信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: