通过学习Vc++深入详解,加上vs提供的Call stack工具,总结出MFC框架的大致流程:
1、theApp的创建,这个对象是C..App的实例,它就是程序的句柄:HInstance对象。
2、WinMain:theApp作为参数传入与HInstance进行形实结合,实际调用AfxWinMain函数完成WinMain函 数的使命。
3、然后AfxWinmain调用InitInstance,它又调用ProcessShellCommand函数
4、窗口类的设计与注册了:
首先,是调用CMainFrame构造函数,然后调用其成员函数"LoadFrame来”开始窗口创建的引导。
为了满足SDI文档的管理,由LoadFrame首先调用:
VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));
在窗口类创建之前都需要调用preCreateWindow函数进行类的设计与注册。当然,也可以完全用MFC为用 户定义的默认style;而注册则使用AfxEndDefRegisterWindow函数,它调用我们耳熟能详的 Register
Window进行注册。
5、窗口的创建:
SDI文档管理的基础打好之后,回到LoadFrame,正式调用Create(lpszClass, lpszTitle, dwDefaultStyle, rectDefault,pParentWnd, MAKEINTRESOURCE(nIDResource), 0L, pContext))函数,然后就是CreateEx,Create进行窗口的创建。它将创建所有MFC向导生成的预定窗口,包括框架窗口、client——view区、工具栏等。所以用调试可以看到多个preCreate--createEX循环。
在视频中作者特意讲了下preCreateWindow的形参CREATESTRUCTURE结构体,它的成员结构与createWindowEx的形参结构如出一辙。CreateEx中又调用了下preCreateWindow,其目的在于能利用CREATESTRUCTURE方便更改窗口的Style,于是在sourceCode中有这样一句注释:// allow modification of several common create parameters;
6、窗口的显示:
最后回到了InitInstance中执行:
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
在教学中,第一章和第三章中都说过showWindow后要加个Update,但是并未说明为何要加这个,以下就是MSDN以及《programming windows》书中对updateWindow的解释。
MSDN:
The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty. The function sends a WM_PAINT message directly to the window procedure of the specified window, bypassing the application queue. If the update region is empty, no message is sent.
programming windows:
causes the client area to be painted. It accomplishes this by sending the window
procedure (that is, the WndProc function in HELLOWIN.C) a WM_PAINT message. We'll soon examine how WndProc deals with this message.
从解释中可以知道这个函数主要负责client的paint。它通过发送WM_PAINT这个消息实现初始化时对not empty区域的刷新,而且仅在初始化时运行一次。
7、消息循环和窗口过程
当InitInstance完成了它的使命之后,便回到了AfxWinMain中继续运行pThread->Run(); 通过查看Run的定义,可以知道头尾中bIdle是用来进行线程同步的(我猜的),而PumpMessage函数封装了translateMessage和Dispatch
Message而完成消息的转发。
从wndcls.lpfnWndProc = DefWindowProc; 看出这里定义的是默认的窗口过程,但实际上MFC做了一个消息映射。
到此为止,其MFC完成了基本框架的架设。