Windows图形界面(GUI)-MFC-C/C++ - MFC项目工程框架解析

目录

MFC项目

项目选择

配置安装

程序引导

MFC框架

环境设置

程序框架

代码编写

MFC解析

程序入口

执行流程

代码结构

应用程序类

窗口框架类

消息处理

消息类型

消息处理

处理机制


MFC项目

项目选择
配置安装
程序引导

MFC框架

环境设置
  • 创建空项目
  • 源文件必须设置为CPP格式后缀
  • 链接器 - 系统 - 设置窗口
  • 配置属性 - 高级 - 设置MFC使用
程序框架
  • MFC头文件
  • 应用程序对象
    • MFC应用程序是基于CWinApp类(应用程序对象)。
    • CWinApp提供了消息循环来检索消息并将消息调度给应用程序的窗口。
    • MFC程序有且只能有一个应用程序对象,对象必须声明在全局范围内有效。
  • CWinApp::InitInstance
    • InitInstance是CWinApp中的虚函数,默认执行操作为返回真,通过返回值决定程序是否正常执行。
    • InitInstance目的是为应用程序提供一个初始化的入口。
代码编写
cpp 复制代码
#include <afxwin.h>

class CMyApp : public CWinApp
{
public:

    virtual BOOL InitInstance();
};

class CMainWindow : public CFrameWnd
{
public:
    CMainWindow();
};

CMyApp myApp;

BOOL CMyApp::InitInstance()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();
    return TRUE;
}

CMainWindow::CMainWindow()
{
    Create(NULL, _T("The Hello Application"));
}

MFC解析

程序入口
  • 控制台程序 - main
  • 动态链接库 - DllMain
  • 应用程序类 - WinMain
  • 驱动程序类 - DriverEntry
  • MFC - AfxWinMain
执行流程
  • 全局应用程序类对象实例化初始。
  • 通过afxWinMain完成初始化(InitInstance)。
  • InitInstance中创建窗口类对象触发构成函数完成窗口创建。
  • 创建窗口成功后将数据保存在m_pMainWndz。
  • 通过窗口类显示以及更新窗口。
代码结构
应用程序类
  • 每个MFC应用程序都必须至少有一个派生自CWinApp的类的实例,该实例代表了应用程序本身。
  • CWinApp类处理应用程序的启动、初始化、运行和退出。
  • InitInstance(): 这是一个必须由派生类重写的虚拟函数。它在应用程序启动时被自动调用,并且是初始化应用程序的主要函数。
  • Run(): 开始应用程序的消息循环。
  • ExitInstance(): 在应用程序退出前被调用,用于清理资源。
  • m_pMainWnd: 指向应用程序的主窗口的指针。
窗口框架类
  • CFrameWnd类代表了一个标准的窗口框架,包括标题栏、菜单栏、工具栏以及状态栏等。
  • 在MFC中,大多数应用程序的主窗口都是从CFrameWnd类派生出来的。
  • LoadFrame(): 根据资源ID加载窗口框架并初始化。
  • Create(): 手动创建窗口框架。
  • PreCreateWindow(): 在窗口创建之前调用,可以修改窗口创建的样式。
  • OnCreate(): 在窗口创建时调用,可以在此添加额外的初始化代码,如创建工具栏和状态栏。
消息处理
消息类型
  • 窗口消息(Window Messages):如WM_LBUTTONDOWN、WM_KEYDOWN等,通常由窗口过程处理。

  • 命令消息(Command Messages):如菜单项、工具栏按钮的点击,消息ID以WM_COMMAND形式出现。

  • 控件通知消息(Control Notification Messages):如按钮点击、列表框选择等,通常由父窗口处理。

  • 自定义消息:开发者可以定义自己的消息,并使用SendMessage或PostMessage发送。

消息处理
  • MFC的消息处理机制是基于消息映射(Message Map)的,它允许开发者将特定的Windows消息映射到特定的成员函数(称为消息处理函数)上。

处理机制
  • DECLARE_MESSAGE_MAP是一个宏,它必须在MFC类的头文件中声明,以便MFC框架能够识别该类具有消息映射。

  • BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏来定义消息映射。

    • BEGIN_MESSAGE_MAP宏接受两个参数:当前类的名称和基类的名称。

    • END_MESSAGE_MAP宏标记消息映射的结束。

  • 代码示例

cpp 复制代码
#include <afxwin.h>

class CMyApp : public CWinApp
{
public:
    virtual BOOL InitInstance();
};

class CMainWindow : public CFrameWnd
{
public:
    CMainWindow();
    DECLARE_MESSAGE_MAP()
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};

CMyApp myApp;

BOOL CMyApp::InitInstance()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();
    return TRUE;
}

CMainWindow::CMainWindow()
{
    Create(NULL, _T("0xCC"));
}

BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()


void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

}
相关推荐
头像很酷3 分钟前
嵌入式虚拟化-xvisor-跨越边界的读客
c语言·hypervisor·xvisor·嵌入式虚拟化
invicinble23 分钟前
对服务器资源的理解--理解用户请求,部署,服务器资源相关的映射层
开发语言
漫步人生走在路上26 分钟前
用小语种SEO突破外贸B2B天花板:法语、德语市场的实测数据
开发语言·前端·javascript·人工智能·搜索引擎·ecmascript
yuniko-n34 分钟前
【JUC】线程池
java·开发语言
Helix25042 分钟前
WinPE 实战:从零制作纯净 Windows 安装与维护 U 盘
windows·安装·uefi·winpe·adk·u盘启动盘·dism
dwm8888888844 分钟前
c# 创建使用本地NuGet包
开发语言·c#
2601_962885721 小时前
如何用 Python 获取上证指数、沪深300、中证500 等指数行情?
开发语言·python
Logic1011 小时前
C语言/数据结构二维数组题解:找出行列O个数均为偶数的格子——奇偶性预处理+二次遍历
c语言·数据结构·算法·二维数组·时间复杂度·动态内存分配·奇偶性
余额瞒着我当琳1 小时前
哈希表底层原理解析,直接定址法,哈希冲突,负载因子,哈希函数,开放定址法
java·c++·哈希算法·散列表
张张123y1 小时前
后端第六课:Python 语法速通(0 基础入门,AI 应用开发的第一门语言)
开发语言·人工智能·python·ai·后端开发