MFC 学习准备

最近更新于 2025-02-20 12:17

前言

最近计划写一个 AutoCAD 插件,交互的地方尽量使用图形界面,便于用户使用。在 AutoCAD 2025 的向导里面有关于启用 MFC 的选项,说明 AutoCAD 推荐的 GUI 库还是有 MFC。
file

很久之前就在网上看到说 MFC(Microsoft Foundation Classes,微软基础类库) 过时了,所以以前就没学,现在有必要用到就得学一学了。MFC 毕竟是对 Windows API 的封装和抽象,在性能上应该会较好,文件应该也不会太大,这方面还是有优势的。在工业领域使用,更加注重实用性,不需要过分好看的界面,能用就行,轻便不吃硬件更好(我使用 CAD 经常感觉到间歇性的卡顿,比如输入命令,取消命令等操作的时候,显卡和CPU都没压力的情况都有这个情况,所以插件还是要尽可能注意性能)。

环境

  • Windows 11 专业版
  • Visual Studio 2022(ISO C++20)

在 Visual Studio Installer 中,勾选使用 C++ 的桌面开发,这是推荐的 C++ 工具链,但是默认没勾选 MFC,右边再勾上适用最新xxxx生成工具的 C++ MFC,然后确认修改进行安装
file

Windows API 相关内容

最好还是对 Windows API 有个概念,这个是我以前用 C 语言写的基于调用 Windows API 的 Hello World 示例程序,也大概展示了程序框架结构:https://blog.iyatt.com/?p=8517

创建 MFC 项目

手动创建一个 Hello World

创建时选 Windows 桌面向导
file

应用程序类型选桌面应用程序,勾选空项目
file

在项目上右键属性,配置属性 – 高级 – MFC 的使用,选 在静态库中使用 MFC在共享 DLL 中使用 MFC,调试的时候可以选动态库,打包发布到没有安装 MFC 的电脑的时候选静态库,会把库文件一起打包。
file

下面写一个简单的窗口

Hello.hpp

#ifndef HELLO_HPP
#define HELLO_HPP

#include "afxwin.h" // MFC 核心头文件

// 应用程序类
class HelloWorldApp : public CWinApp
{
public:
    /**
     * @brief 应用程序初始化。重写 CWinApp::InitInstance() 方法
     * @return 初始化成功与否
     */
    virtual BOOL InitInstance() override;
};

// 窗口类
class HelloWorldFrame : public CFrameWnd
{
public:
    /**
     * @brief 初始化窗口
     */
    HelloWorldFrame();

protected:
    afx_msg void OnPaint(); // 固定的函数名称,用于响应 WM_PAINT 消息,进行窗口绘制
    DECLARE_MESSAGE_MAP() // 宏声明消息映射表,用于关联消息和处理函数
};

#endif

Hello.cpp

#include "Hello.hpp"

// 全局应用程序对象,MFC 会自动调用它的 InitInstance 方法
HelloWorldApp app;

BOOL HelloWorldApp::InitInstance()
{
    // 创建主窗口
    m_pMainWnd = new HelloWorldFrame;

    // 显示主窗口
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();

    return TRUE;
}

HelloWorldFrame::HelloWorldFrame()
{
    // 创建窗口
    // 参数:
    // 第一个参数:父窗口指针,为 nullptr 表示没有父窗口
    // 第二个参数:窗口标题
    // 第三个参数:窗口风格
    // 第四个参数:窗口位置和大小
    Create(nullptr, L"Hello World", WS_OVERLAPPEDWINDOW, CRect(0, 0, 300, 200));
}

void HelloWorldFrame::OnPaint()
{
    // 创建一个设备上下文对象,用于绘制窗口内容
    CPaintDC dc(this);
    // 绘制文本
    // 参数:
    // 第一、二个参数:文本绘制的起始位置
    // 第三各参数:要绘制的文本字符串
    dc.TextOutW(100, 80, L"你好,世界");
}

// 消息映射表,将 WM_PAINT 消息映射到 OnPaint 方法
BEGIN_MESSAGE_MAP(HelloWorldFrame, CFrameWnd)
    ON_WM_PAINT()
END_MESSAGE_MAP()

file

使用 MFC 模板

创建时选 MFC 应用
file

应用程序类型:单个文档
项目样式:MFC standard
file

运行效果
file

文档

https://learn.microsoft.com/zh-cn/cpp/mfc/mfc-desktop-applications?view=msvc-170

MFC 学习准备
Scroll to top