从CWnd中找出Win32 Application的清晰结构

CWnd作为MFC的基础窗体类,封装了WIN32API,通过Create或CreateEx函数创建窗体。CWnd::WindowProc是消息处理的核心,涉及PreCreateWindow等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CWnd是MFC中所有窗体类的基类,对WIN32 API函数进行了封装。
由于涉及到进程、线程、安全等内容,使得CWnd类有些复杂。
然而,结构是清晰的,遵循WIN32 APPLICATION的编程思路。

CWnd是一个管理窗体的类,而不是一个真正的窗体,这样说可能有些矛盾。
在WIN32下,窗体仅仅是CreateWindow函数返回的一个句柄所代表的内部数据结构。
在CWnd类中有这样一个窗体句柄m_hWnd作为成员变量,CWnd的成员函数都是通过对这个这个句柄调用API函数来实现的。
仅仅new一个CWnd类是不能得到一个实际的窗体,而仅仅是得到一个具有操作窗体方法的类。
为此,需要调用Create成员函数或者CreatEx成员函数来创建一个实际的窗体。
分析CWnd类的代码可以看到,无论是Create还是CreateEx,最后都是调用原型为
CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
         LPCTSTR lpszWindowName, DWORD dwStyle,
         int x, int y, int nWidth, int nHeight,
         HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
 的函数,因此,窥探CWnd类就从这个函数开始。

 抛开函数调用失败的处理,那么这个函数仅仅是对三个函数进行顺序调用:
 CWnd::PreCreateWindow();//在创建窗体前给用户一个修改窗体属性的机会,用户经常会在派生类中重载这个函数。
AfxHookWindowCreate();   //注册窗口函数。
AfxCtxCreateWindowEx();  //创建窗体,使m_hWnd获得创建的窗体句柄

跟踪AfxHookWindowCreate()的代码,可以看到这样一个函数调用顺序:
_AfxCbtFilterHook    -> 
WNDPROC afxWndProc = AfxGetAfxWndProc();
//将AfxGetAfxWndProc得到的函数指针当作窗体函数
oldWndProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC,(DWORD_PTR)afxWndProc);
进到AfxGetAfxWndProc中  ->AfxWndProc  ->AfxCallWndProc  ->pWnd->WindowProc(nMsg, wParam, lParam);
至此,原来这么一系列的调用,最终把CWnd::WindowProc作为窗体函数了。

CWnd::WindowProc这个函数就很简单了,在这里面就能看到我们熟悉的CWnd::OnWndMsg()、CWnd::OnCommand()、CWnd::OnNotify()等等。
CWnd与窗体消息机制的联系就到此,可以用WIN32 APPLICATION清晰的结构来理解CWnd复制的结构了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值