- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> e链接点击跳转博客主页
目录
MFC项目
项目选择
配置安装
程序引导
MFC框架
环境设置
- 创建空项目
- 源文件必须设置为CPP格式后缀
- 链接器 - 系统 - 设置窗口
- 配置属性 - 高级 - 设置MFC使用
程序框架
- MFC头文件
- 应用程序对象
- MFC应用程序是基于CWinApp类(应用程序对象)。
- CWinApp提供了消息循环来检索消息并将消息调度给应用程序的窗口。
- MFC程序有且只能有一个应用程序对象,对象必须声明在全局范围内有效。
- CWinApp::InitInstance
- InitInstance是CWinApp中的虚函数,默认执行操作为返回真,通过返回值决定程序是否正常执行。
- InitInstance目的是为应用程序提供一个初始化的入口。
代码编写
cpp
#include <afxwin.h>
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMainWindow : public CFrameWnd
{
public:
CMainWindow();
};
CMyApp myApp;
BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CMainWindow::CMainWindow()
{
Create(NULL, _T("The Hello Application"));
}
MFC解析
程序入口
- 控制台程序 - main
- 动态链接库 - DllMain
- 应用程序类 - WinMain
- 驱动程序类 - DriverEntry
- MFC - AfxWinMain
执行流程
- 全局应用程序类对象实例化初始。
- 通过afxWinMain完成初始化(InitInstance)。
- InitInstance中创建窗口类对象触发构成函数完成窗口创建。
- 创建窗口成功后将数据保存在m_pMainWndz。
- 通过窗口类显示以及更新窗口。
代码结构
应用程序类
- 每个MFC应用程序都必须至少有一个派生自
CWinApp
的类的实例,该实例代表了应用程序本身。 CWinApp
类处理应用程序的启动、初始化、运行和退出。InitInstance()
: 这是一个必须由派生类重写的虚拟函数。它在应用程序启动时被自动调用,并且是初始化应用程序的主要函数。Run()
: 开始应用程序的消息循环。ExitInstance()
: 在应用程序退出前被调用,用于清理资源。m_pMainWnd
: 指向应用程序的主窗口的指针。
窗口框架类
CFrameWnd
类代表了一个标准的窗口框架,包括标题栏、菜单栏、工具栏以及状态栏等。- 在MFC中,大多数应用程序的主窗口都是从
CFrameWnd
类派生出来的。 LoadFrame()
: 根据资源ID加载窗口框架并初始化。Create()
: 手动创建窗口框架。PreCreateWindow()
: 在窗口创建之前调用,可以修改窗口创建的样式。OnCreate()
: 在窗口创建时调用,可以在此添加额外的初始化代码,如创建工具栏和状态栏。
消息处理
消息类型
-
窗口消息(Window Messages):如
WM_LBUTTONDOWN
、WM_KEYDOWN
等,通常由窗口过程处理。 -
命令消息(Command Messages):如菜单项、工具栏按钮的点击,消息ID以
WM_COMMAND
形式出现。 -
控件通知消息(Control Notification Messages):如按钮点击、列表框选择等,通常由父窗口处理。
-
自定义消息:开发者可以定义自己的消息,并使用
SendMessage
或PostMessage
发送。
消息处理
-
MFC的消息处理机制是基于消息映射(Message Map)的,它允许开发者将特定的Windows消息映射到特定的成员函数(称为消息处理函数)上。
处理机制
-
DECLARE_MESSAGE_MAP
是一个宏,它必须在MFC类的头文件中声明,以便MFC框架能够识别该类具有消息映射。 -
BEGIN_MESSAGE_MAP
和END_MESSAGE_MAP
宏来定义消息映射。-
BEGIN_MESSAGE_MAP
宏接受两个参数:当前类的名称和基类的名称。 -
END_MESSAGE_MAP
宏标记消息映射的结束。
-
-
代码示例
cpp
#include <afxwin.h>
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMainWindow : public CFrameWnd
{
public:
CMainWindow();
DECLARE_MESSAGE_MAP()
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};
CMyApp myApp;
BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CMainWindow::CMainWindow()
{
Create(NULL, _T("0xCC"));
}
BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
}