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

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复制的结构了。

你可能感兴趣的:(数据结构,编程,api,application,mfc)