MFC-01


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 程序分类:

  1. 控制台程序
  2. 窗口程序
  3. 静态库程序
  4. 动态库程序

常见头文件:

  1. afx.h 将各种mfc头文件包含在内
  2. afxwin.h 包含了各种mfc窗口类。包含 afx.h 和 windows.h
  3. afxext.h  各种拓展窗口类的支持,如 工具栏、状态栏

mfc程序和win32程序区别:能否调用mfc库

  1. mfc中调用 win32api 使用 ::FindWindow() 的形式,以 :: 开头
  2. 使用 Afx 开头的函数是mfc定义的全局函数

mfc 窗口程序的分类:

MFC-01

创建单文档程序

MFC-01

多文档视图架构:

MFC-01

 

 

 

 

MFC 相关类:
MFC-01

MFC-01

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-01

MFC 启动原理:

mfc 与 win32 都是从 WinMain 入口,但是 MFC库 已经实现了 WinMain 函数,所以程序中无需实现。Win32 中流程由程序员安排,但在MFC中,由于MFC实现WinMain,也就是意味着MFC安排程序的流程。

c++中全局对象的初始化在主函数之前,构建 CMyWinApp 时调用了父类 CWinApp 的构造函数

  1. 将theApp地址保存到线程状态信息
  2. 将theApp地址保存到模块信息
  3. 进入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函数

MFC-01

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

常见成员虚函数:

  1. InitInstance 初始化函数
  2. ExitInstance 清理资源等善后工作
  3. Run  消息循环
  4. OnIdle  空闲处理函数

常见成员变量:

  1. m_pMainWnd 当前应用程序的主窗口

 

原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/278401.html

(0)
上一篇 2022年8月2日
下一篇 2022年8月2日

相关推荐

发表回复

登录后才能评论