MFC框架流程(vc++深入详解第3课)

来源:互联网 发布:淘宝童装店设计思路 编辑:程序博客网 时间:2024/06/16 07:54

通过学习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完成了基本框架的架设。

 

原创粉丝点击