[面试] C/C++ —— MFC
2016-03-27 10:25
453 查看
MFC 源程序所在路径:
_tWinMain 所在的文件是 APPMODUL.cpp
真实的启动顺序为:
唯一的全局的 C**App theApp; ⇒ 其构造函数处 ⇒ _tWinMain
MFC 程序的手法:main 函数调用全局函数 AfxGetApp 以取得 theApp 的对象指针。
设计窗口类:
已有MFC设计完成,只差一个注册的问题
注册完成之后:
创建窗口
显示窗口
更新窗口
消息循环
完整流程如下:
(1)全局对象
(2)全局对象的构造
(3)_tWinMain
(4)AfxWinMain 完成一部分初始化的工作
(5)InitInstance
(6)注册窗口
(7)创建窗口
(8)窗口创建完毕结束,回到 BOOL CDIPDemoApp::InitInstance(),完成窗口的显示和更新
CWinThread(CWnd* m_pMainWnd) ==> CWinApp ==> CMyApp
m_pMainWnd 用于指向CMainFrame框架窗口
D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC
看不见的 WinMain
当我们在编译链接的时候,链接器将WinMain函数链接进程序包中的,WinMain 成为我们程序的一部分。#define _tWinMain WinMain
_tWinMain 所在的文件是 APPMODUL.cpp
真实的启动顺序为:
唯一的全局的 C**App theApp; ⇒ 其构造函数处 ⇒ _tWinMain
CWinApp* AfxGetApp();
C++ 规定,全局对象的构建将比程序入口点(在 DOS 环境为 main,在 Windows 环境为 WinMain)更早。// MFC.cpp extern CMyApp theApp; CWinApp* AfxGetApp() { return theApp.m_pCurrentApp; } // my.cpp CMyApp theApp; int main(int, char**) { CWinApp* pApp = AfxGetApp(); ... return 0; };
MFC 程序的手法:main 函数调用全局函数 AfxGetApp 以取得 theApp 的对象指针。
CWinApp
其源码所在文件为:APPCORE.cppMFC 执行流程
其中窗口的处理流程为:设计窗口类:
已有MFC设计完成,只差一个注册的问题
注册完成之后:
创建窗口
显示窗口
更新窗口
消息循环
完整流程如下:
(1)全局对象
CDIPDemoApp theApp;
(2)全局对象的构造
CDIPDemoApp::CDIPDemoApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance }
(3)_tWinMain
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // call shared/exported WinMain return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); }
(4)AfxWinMain 完成一部分初始化的工作
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { if (!pThread->InitInstance())
(5)InitInstance
BOOL CDIPDemoApp::InitInstance() { ... }
(6)注册窗口
BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister) { } BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass) { }
(7)创建窗口
BOOL CFrameWnd::Create(LPCTSTR lpszClassName, ... { 会去调用 CWnd::CreateEx BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, LPVOID lpParam /* = NULL */) {
(8)窗口创建完毕结束,回到 BOOL CDIPDemoApp::InitInstance(),完成窗口的显示和更新
BOOL CDIPDemoApp::InitInstance() { ... m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); }
CWinThread(CWnd* m_pMainWnd) ==> CWinApp ==> CMyApp
m_pMainWnd 用于指向CMainFrame框架窗口
相关文章推荐
- 在C语言中解析JSON配置文件
- C++值传递时返回临时变量,引用传参
- 《21天学通C++(第五版)》 [美] Jesse Liberty Bradley Jones著——个人学习笔记
- C++作业2
- [面试] C/C++ 语法(五) —— extern
- c语言 typedef
- C语言中内存分配
- C++输出流格式
- C语言基本概念之序列点
- 排序——堆排序(C++)
- c++设计一个计时器(能够暂停,重新开始,继续)的功能。写的不好,仅供参考!
- 设计模式 之 单例模式 (C++ 懒汉经典实现 & DCL实现 & 饿汉经典实现)
- 牛客网 算法第一题 二叉树按层次打印问题
- C++11智能指针之shared_ptr的使用(1)
- 《C++》06 C++ 存储类
- 《C++》05 C++ 修饰符类型
- 《C++》 04 C++ 常量
- C/C++中内联函数与静态函数
- 《C++》03 C++ 变量作用域
- 1.2.2 Box of Bricks