MFC 核心框架与消息处理机制

MFC 核心框架与消息处理机制

核心思想

MFC 的核心思想是 “以消息为基础,以事件驱动之”。这意味着应用程序的运行完全由操作系统发送的消息来驱动和控制,程序代码通过响应这些消息来执行相应的功能。

Win32 创建窗口流程

1. 填写窗口类

  • 创建一个 WNDCLASSWNDCLASSEX结构体。
  • 定义窗口的基本属性,如窗口过程函数、图标、光标、背景色、菜单和类名等。

2. 注册窗口类

  • 调用 RegisterClassRegisterClassEx函数,将上一步填好的窗口类结构体注册到操作系统中。这个类成为后续创建窗口的“模板”。

      3. 创建窗口

      • 调用 CreateWindowCreateWindowEx函数。
      • 依据已注册的窗口类,创建一个具体的窗口对象。此阶段指定窗口的详细属性,如样式、位置、大小、父窗口、菜单等。

      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 核心框架与消息处理机制-萝莉猫博客

      核心基类详解

                一、 根类: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 开发的复杂度,适合快速构建复杂的桌面应用程序(如办公软件、图形工具等)。

                © 版权声明
                THE END
                喜欢就支持一下吧
                点赞0 分享
                评论 抢沙发

                请登录后发表评论

                  暂无评论内容