原文地址:李浩的博客 lihaohello.top
MFC曾在Windows桌面开发领域大放异彩,但随着时间的推移,如今相比各种流行的GUI开发技术(QT、WPF、Flutter、Web技术等),MFC被贴上“古老”、“落后”的标签。
但有大量工业软件采用MFC进行开发,且在AutoCAD二次开发领域,MFC是官方指定的ObjectARX界面开发方式,掌握MFC技术具有一定的现实需求。
本文从整体上介绍MFC单文档和多文档应用程序的整体框架。
核心类
CWinApp - 程序类
- 定义一个全局CWinApp对象,作为程序爆破点
- 重写InitInstance()虚函数,在其中创建框架类对象
#include<afxwin.h>
// 自定义程序类
class CMyWinApp :public CWinApp {
public:
virtual BOOL InitInstance() override;
};
BOOL CMyWinApp::InitInstance() {
CMyFrameWnd* pFrame = new CMyFrameWnd;
pFrame->Create(NULL, "MFCView");
m_pMainWnd = pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}
// 程序爆破点
CMyWinApp theApp;
CFrameWnd - 框架类
- 作为容纳菜单、工具条、状态条、视口等元素的容器
- 在其WM_CREATE事件处理函数中创建视图类的对象等
CView - 视图类
使用步骤:
- 自定义程序类和框架类
- 自定义视图类,派生自CView,重写纯虚函数OnDraw(),用于绘制视图
- 在自定义框架类中的WM_CREATE消息处理函数中,调用Create()创建视图窗口,如果指定窗口ID为AFX_IDW_PANE_FIRST,则按照框架窗口大小确定视图大小
- OnDraw()虚函数由父类的WM_PAINT事件处理函数来调用,优先使用该方法来实现视图的绘制
// 1、自定义视图类
class CMyView :public CView {
virtual void OnDraw(CDC* pDC) override;
};
// 如果重新重新处理WM_PAINT消息,那么就使用OnDraw绘图!
void CMyView::OnDraw(CDC* pDC) {
pDC->TextOut(50, 50, "我是CMyView", strlen("我是CMyView"));
}
// 自定义框架类
class CMyFrameWnd :public CFrameWnd {
private:
CMyView* pView;
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
afx_msg int OnCreate(LPCREATESTRUCT pcs);
};
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_WM_PAINT()
ON_WM_CREATE()
END_MESSAGE_MAP()
void CMyFrameWnd::OnPaint() {
PAINTSTRUCT ps = {
0 };
HDC hdc = ::Be