ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MFC-01

2022-08-02 09:04:01  阅读:170  来源: 互联网

标签:mfc 01 调用 程序 MFC theApp 函数


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  各种拓展窗口类的支持,如 工具栏、状态栏
  4. ...

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

  1. mfc中调用 win32api 使用 ::FindWindow() 的形式,以 :: 开头
  2. 使用 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 的构造函数

  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函数

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 当前应用程序的主窗口

 

标签:mfc,01,调用,程序,MFC,theApp,函数
来源: https://www.cnblogs.com/zhh567/p/16533972.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有