文章目录
MFC程序结构
这一章节主要介绍了MFC程序的结构,实际上进行MFC编程,是直接用MFC向导来创建。但通过这个章节我们可以看到MFC程序的基本结构和对消息的处理流程,这对理解MFC程序是非常有用的
使用Win32创建MFC程序

点击下一步 选择空项目

右键项目 选择添加类

删除头文件 和 cpp的所有代码 开始添加下面的代码
mfc.h
cpp
#pragma once
// MFC头文件
#include <afxwin.h>
// 应用程序类 CWinApp
class MyApp :public CWinApp {
public:
// MFC程序入口地址
virtual BOOL InitInstance();
};
// 框架类(窗口类)
class MyFrame :public CFrameWnd {
public:
MyFrame();
};
mfc.cpp
cpp
#include "mfc.h"
// 有且只要一个全局的应用程序类对象
MyApp theApp;
// MFC程序入口地址
BOOL MyApp::InitInstance() {
// 创建框架类对象
MyFrame *frame = new MyFrame;
// 显示窗口
frame->ShowWindow(SW_SHOWNORMAL);
// 更新窗口
frame->UpdateWindow();
// 保存框架类对象指针(指向应用程序主窗口的指针)
m_pMainWnd = frame;
return TRUE;
}
MyFrame::MyFrame() {
Create(NULL, TEXT("MFC"));
}
在项目属性中找到常规->MFC的使用改为在共享DLL中使用MFC,就可以编译运行了。

使用以上程序,可以直接生成一个窗口。可以看到,MFC比 Windows编程基础 这篇文章中介绍的使用Windows API去创建窗口要简单很多。
MFC程序的入口地址是 InitInstance() 。很多初学者创建一个MFC程序后,习惯性的去找main函数,那在MFC程序中是没有main函数的,MFC将main函数进行了封装,对开发者来说,入口函数就是 InitInstance()。
消息映射
消息映射是一个将消息和成员函数相互关联的表。类似于QT中的信号槽,将信号槽进行绑定。这样当有消息发生时,就会自动执行对应的成员函数。
消息映射编程步骤
所操作的类中,声明消息映射宏
cpp
DECLARE_MESSAGE_MAP()
对应的源文件中定义宏
cpp
// 定义消息宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd) // 开始
ON_WM_LBUTTONDOWN() // 鼠标左键按下消息
ON_WM_CHAR() // 键盘按下消息
END_MESSAGE_MAP() //结束
在所操作类中,声明消息处理函数
cpp
//函数声明
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT, UINT);
对应源文件中消息处理函数实现
cpp
//函数声明
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT, UINT);
完整代码
mfc.h
cpp
#pragma once
// MFC头文件
#include <afxwin.h>
// 应用程序类 CWinApp
class MyApp :public CWinApp {
public:
// MFC程序入口地址
virtual BOOL InitInstance();
};
// 框架类(窗口类)
class MyFrame :public CFrameWnd {
public:
MyFrame();
// 声明消息映射
DECLARE_MESSAGE_MAP()
//函数声明
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT, UINT);
};
mfc.cpp
cpp
#include "mfc.h"
// 有且只要一个全局的应用程序类对象
MyApp theApp;
// MFC程序入口地址
BOOL MyApp::InitInstance() {
// 创建框架类对象
MyFrame *frame = new MyFrame;
// 显示窗口
frame->ShowWindow(SW_SHOWNORMAL);
// 更新窗口
frame->UpdateWindow();
// 保存框架类对象指针(指向应用程序主窗口的指针)
m_pMainWnd = frame;
return TRUE;
}
// 定义消息宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd) // 开始
ON_WM_LBUTTONDOWN() // 鼠标左键按下消息
ON_WM_CHAR() // 键盘按下消息
END_MESSAGE_MAP() //结束
MyFrame::MyFrame() {
Create(NULL, TEXT("MFC"));
}
// 鼠标按下消息处理程序
void MyFrame::OnLButtonDown(UINT, CPoint point) {
TCHAR tBuf[1024] = { 0 };
wsprintf(tBuf, TEXT("x = %d, y = %d\n"), point.x, point.y);
MessageBox(tBuf);
}
// 键盘按下消息处理程序
void MyFrame::OnChar(UINT key, UINT, UINT) {
CString str;
str.Format(TEXT("按下了 %c 键"), key);
MessageBox(str);
}
以上章节是为了让我们理解MFC程序的结构,接下来就真正进入到MFC编程中。