MFC
调试快捷键
- F6: 生成解决方案
- Ctrl+F6: 生成当前项目
- F7: 查看代码
- Shift+F7: 查看窗体设计器
- F5: 启动调试
- Ctrl+F5: 开始执行(不调试)
- Shift+F5: 停止调试
- Ctrl+Shift+F5: 重启调试
- F9: 切换断点
- Ctrl+F9: 启用/停止断点
- Ctrl+Shift+F9: 删除全部断点
- F10: 逐过程
- Ctrl+F10: 运行到光标处
- F11: 逐语句
windows 程序分类:
- 控制台程序
- 窗口程序
- 静态库程序
- 动态库程序
常见头文件:
- afx.h 将各种mfc头文件包含在内
- afxwin.h 包含了各种mfc窗口类。包含 afx.h 和 windows.h
- afxext.h 各种拓展窗口类的支持,如 工具栏、状态栏
- …
mfc程序和win32程序区别:能否调用mfc库
- mfc中调用 win32api 使用
::FindWindow()
的形式,以::
开头 - 使用 Afx 开头的函数是mfc定义的全局函数
mfc 窗口程序的分类:
创建单文档程序
多文档视图架构:
MFC 相关类:
MFC 类层次结构图:https://docs.microsoft.com/zh-cn/cpp/mfc/hierarchy-chart?view=msvc-170
一个最简单的 MFC 程序
MFC
#include <afxwin.h>
class CMyFrameWnd : public CFrameWnd
{
};
class CMyWinApp : public CWinApp
{
public:
CMyWinApp() {}
virtual BOOL InitInstance() // 这个虚函数的功能是将自己写的代码加到库中的WinMain中
{
CMyFrameWnd* pFrame = new CMyFrameWnd;
pFrame->Create(NULL, L"MFCBase");
this->m_pMainWnd = pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}
};
CMyWinApp theApp;
效果:
MFC 启动原理:
mfc 与 win32 都是从 WinMain 入口,但是 MFC库 已经实现了 WinMain 函数,所以程序中无需实现。Win32 中流程由程序员安排,但在MFC中,由于MFC实现WinMain,也就是意味着MFC安排程序的流程。
c++中全局对象的初始化在主函数之前,构建 CMyWinApp
时调用了父类 CWinApp
的构造函数
- 将theApp地址保存到线程状态信息
- 将theApp地址保存到模块信息
- 进入WinMain函数,调用AfxWinMain函数。
核心的四条语句如下:
AFX_MODULE_STATE aaa; // 当前程序模块状态信息
AFX_MODULE_THREAD_STATE bbb; // 当前程序线程状态信息
CWinApp::CWinApp()
{
AFX_MOUDLE_STATE* pModuleState = AfxGetModuleState(); // 获取全局变量 &aaa
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread; // 获取全局变量 &bbb
pThreadState->m_pCurrentWinThread = this; // 将 &theApp 保存到bbb的一个成员中
pModuleState->m_pCurrentWinApp = this; // 将 &theApp 保存到aaa的一个成员中
// 调用 AfxGetThread() 和 AfxGetApp() 返回的都是 theApp 的地址
}
MFC 内部实现了main函数
WinMain() // theApp 对象指导程序流程的走向
{
AfxWinMain()
{
CWinThread* pThread = AfxGetThread(); // 获取 &theApp
CWinApp* pApp = AfxGetApp(); // 获取 &theApp
pApp->InitApplication(); // 利用theApp调用应用程序类成员虚函数,初始化
pThread->InitInstance(); // 利用theApp调用应用程序类成员虚函数,创建并显示窗口
pThread->Run() // 利用theApp调用应用程序类成员虚函数,消息循环
{
for(::)
{
while(没有消息时) {
OnIdle(...); // 利用theApp对象调用应用程序类成员虚函数,空闲处理
}
do{
if(GetMessage 收到 WM_QUIT) {
return ExitInstance(); // 程序结束前,利用theApp对象调用应用程序类成员虚函数,释放资源
}
}while()
}
};
}
}
库提供的 WinMain 函数调用了theApp 的虚函数,通过重写虚函数可以实现更改程序流程。成员变量和方法:https://docs.microsoft.com/zh-cn/cpp/mfc/reference/cwinapp-class?view=msvc-170
常见成员虚函数:
- InitInstance 初始化函数
- ExitInstance 清理资源等善后工作
- Run 消息循环
- OnIdle 空闲处理函数
常见成员变量:
- m_pMainWnd 当前应用程序的主窗口
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/278401.html