MFC入门教程:从环境配置到项目创建
MFC入门教程:从环境配置到项目创建
MFC(Microsoft Foundation Classes)是微软的基础类库,是对Windows API的封装和抽象,具有性能优势。本文将介绍MFC的学习准备,包括环境配置、项目创建等基础内容。
前言
最近计划写一个AutoCAD插件,交互的地方尽量使用图形界面,便于用户使用。在AutoCAD 2025的向导里面有关于启用MFC的选项,说明AutoCAD推荐的GUI库还是有MFC。
很久之前就在网上看到说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,然后确认修改进行安装
Windows API相关内容
最好还是对Windows API有个概念,这个是我以前用C语言写的基于调用Windows API的Hello World示例程序,也大概展示了程序框架结构:https://blog.iyatt.com/?p=8517
创建MFC项目
手动创建一个Hello World
创建时选Windows 桌面向导
应用程序类型选桌面应用程序,勾选空项目
在项目上右键属性,配置属性 – 高级 – MFC的使用,选在静态库中使用MFC或在共享DLL中使用MFC,调试的时候可以选动态库,打包发布到没有安装MFC的电脑的时候选静态库,会把库文件一起打包。
下面写一个简单的窗口
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()
使用MFC模板
创建时选MFC应用
应用程序类型:单个文档
项目样式:MFC standard
运行效果
文档
https://learn.microsoft.com/zh-cn/cpp/mfc/mfc-desktop-applications?view=msvc-170
Visual Studio使用疑问
解决方案资源管理器、类视图、资源视图、工具箱等不可见
可能是默认设置没显示,或者有时候点了×就看不到了,可以在视图中看到对应选项,点击就会打开显示
多个视图同时显示可能占位置,可以拖动合并在一起,通过底部的标签切换
MFC编辑页面时要使用到一些图形控件,在工具箱中,默认可能会自动停靠左右两侧隐藏,点开就出来了,展开的时候可以点右上角的×的左边的钉子图标取消自动隐藏