核心思想
MFC 的核心思想是 “以消息为基础,以事件驱动之”。这意味着应用程序的运行完全由操作系统发送的消息来驱动和控制,程序代码通过响应这些消息来执行相应的功能。
Win32 创建窗口流程
1. 填写窗口类
- 创建一个
WNDCLASS或WNDCLASSEX结构体。 - 定义窗口的基本属性,如窗口过程函数、图标、光标、背景色、菜单和类名等。
2. 注册窗口类
- 调用
RegisterClass或RegisterClassEx函数,将上一步填好的窗口类结构体注册到操作系统中。这个类成为后续创建窗口的“模板”。
3. 创建窗口
- 调用
CreateWindow或CreateWindowEx函数。 - 依据已注册的窗口类,创建一个具体的窗口对象。此阶段指定窗口的详细属性,如样式、位置、大小、父窗口、菜单等。
4. 显示窗口
- 调用
ShowWindow(hWnd, nCmdShow)来设置窗口的显示状态(例如,正常显示、最大化、最小化)。 - 调用
UpdateWindow(hWnd)来立即向窗口发送WM_PAINT消息,促使窗口立即绘制其客户区。
6. 消息循环
进入核心的 while (GetMessage(...))循环,不断从消息队列中取出消息、翻译(TranslateMessage)、分发(DispatchMessage)到对应的窗口过程函数。
- 应用程序进入一个核心循环——消息循环。
- 循环不断调用
GetMessage函数从线程的消息队列中取出消息。 - 调用
TranslateMessage函数转换键盘消息(如将按键转换为字符消息WM_CHAR)。 - 调用
DispatchMessage函数,将消息分发到对应的窗口过程函数(WindowProc)中进行处理。 - 当收到
WM_QUIT消息时,循环结束,程序退出。
MFC类层次结构
MFC 库通过一套庞大的类层次结构封装了上述Win32 API的复杂性。其大部分类都从一个根类(通常是 CObject或其相关基类)派生而来,形成了清晰的继承体系。
![图片[1]-MFC 核心框架与消息处理机制-萝莉猫博客](https://www.luolimao.com/wp-content/uploads/2026/03/20260302104337402-CObject-edited.png)
核心基类详解
一、 根类:CObject
地位:MFC 所有类的最终祖先,是 MFC 面向对象封装的基础。
核心能力:
- 运行时类型识别 (RTTI):支持
IsKindOf()方法,可在运行时判断对象类型。 - 序列化 (Serialization):支持
Serialize()方法,实现对象数据(如文档)的保存(存盘)和加载(读盘)。 - 调试支持:提供
AssertValid()(验证对象状态)和Dump()(输出对象信息)等调试工具。
意义:为 MFC 类提供统一的类型管理、持久化能力和调试基础设施。
二、 命令与应用程序分支:CCmdTarget
继承关系:CObject → CCmdTarget
核心职责:处理消息(尤其是命令消息,如菜单、按钮操作),是 MFC 消息映射机制的载体。
关键派生类:
1. CWinThread(线程类):
- 封装 Windows 线程的执行环境,管理线程的生命周期(创建、启动、终止)。
- 是所有线程对象的基类(如主线程、工作线程)。
2. CWinApp(应用程序类):
- 每个 MFC 程序必须有且仅有一个
CWinApp派生类对象(如CMyApp),代表程序本身。 - 职责:初始化程序(如注册窗口类、加载资源)、启动消息循环(
Run()方法)、处理程序退出逻辑。
3. CWnd(窗口基类):
- 封装 Windows 窗口句柄(
HWND),提供窗口的创建、销毁、显示、移动等基础操作。 - 是所有窗口类的基类(如对话框、框架窗口、视图等),负责处理窗口消息(如鼠标、键盘、绘制消息)。
4. CDocument(文档类):
- 代表数据模型(如文档中的文本、图形数据),负责数据的加载、保存、修改管理。
- 是“文档-视图”架构的核心,与
CView配合实现数据与界面的分离。
三、 窗口与文档-视图分支:CWnd及其派生类
CWnd是 MFC 窗口体系的核心,从它派生出各类具体窗口(对话框、框架、视图等):
1. CDialog(对话框类):
- 处理模态/非模态对话框的创建与管理(如“关于”对话框
CAboutDlg)。 - 封装对话框资源(.rc 文件中定义的对话框模板),处理对话框的初始化、控件交互、消息响应。
2. CFrameWnd(框架窗口类):
- 代表主窗口(如
CMainFrame),管理菜单、工具栏、状态栏,以及承载视图(CView)。 - 是多文档界面(MDI)或单文档界面(SDI)的“外壳”,提供窗口的框架结构(如标题栏、边框、菜单栏)。
3. CView(视图类):
- 代表客户区/显示区域(如
CMFCView),负责数据的可视化展示(如绘制图形、显示文本)。 - 与
CDocument绑定,通过“文档-视图”架构实现数据驱动界面(文档提供数据,视图负责显示)。 - 处理鼠标、键盘等与显示相关的消息,响应用户的交互操作。
四、MFC 扩展类(虚线框)
- CMyApp:继承 CWinApp,实现程序的个性化初始化(如 InitInstance()配置窗口、加载资源)。
- CMainFrame:继承 CFrameWnd,定制主窗口的外观(如添加自定义菜单、工具栏)。
- CMFCView:继承 CView,实现特定的视图绘制逻辑(如绘图、文本渲染)。
- CMFCDoc:继承 CDocument,管理特定的数据结构(如自定义文档类,存储复杂数据)。
五、核心架构总结
MFC 类层次结构通过 “对象-命令-窗口-文档-视图” 的分层设计,实现了:
- 消息驱动的命令处理(
CCmdTarget分支):集中管理菜单、按钮等命令消息的路由。 - 数据与界面分离(
CDocument+CView):文档负责数据,视图负责显示,降低耦合。 - 窗口的统一封装(
CWnd分支):屏蔽 Windows API 的底层细节,提供面向对象的窗口操作接口。 - 程序生命周期管理(
CWinApp):封装程序的启动、运行、退出流程。
这种分层设计让 MFC 既保留了 Windows API 的灵活性,又通过面向对象封装大幅降低了 Windows 开发的复杂度,适合快速构建复杂的桌面应用程序(如办公软件、图形工具等)。








暂无评论内容