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完成了基本框架的架设。
- MFC框架流程(vc++深入详解第3课)
- 《VC++深入详解》学习笔记[2]——第3章MFC框架程序剖析
- VC++深入详解(1):MFC框架程序剖析
- 孙鑫VC++深入详解(2):mfc框架程序剖析
- 孙鑫《vc ++深入详解》第三章mfc框架程序剖析
- VC++深入详解(3):MFC文本编程
- MFC:Learning VC++深入详解
- VC++深入详解(5):MFC对话框(一)
- VC++深入详解(6):MFC对话框(二)
- VC++深入详解(5):MFC对话框(一)
- VC++深入详解(4):MFC菜单设计
- 《VC++深入详解》学习笔记 第三章 MFC框架程序剖析(未完成)
- VC++深入详解笔记——3.MFC框架程序剖析
- 《VC++深入详解》读书笔记——3.MFC程序框架剖析
- 孙鑫 VC++深入详解第15课——多线程
- VC++深入详解 第6章 菜单
- 第3课 mfc框架程序剖析
- 第3课 MFC框架程序
- 玩物丧志
- 广州市政府批准经济发展规划 将建新世纪CBD
- SSH2框架使用(一)
- 一个unix的贪吃蛇小游戏
- VC++中的Dll调用及Dll的调试
- MFC框架流程(vc++深入详解第3课)
- 在Magento 设计集成中关于products list等页面中TD或LI 的等高处理(分行处理)
- 错落有致——集团企业信息化规划原则
- 程序员创业生死一线 最后归宿在哪里?
- 系统处理非模态对话框和模态对话框的区别
- JavaScript 中的基本数据类型 数组 循环
- SSH2框架使用(二)
- 模式对话框与非模式对话框的区别
- J2ME(ALERT: java/lang/ClassFormatError: Bad version information.)错误的解决