MFC自定义消息
在编写多界面之间的通信时,MFC是基于消息以及消息响应的机制。本篇学习笔记则简单总结一下MFC下实现多界面(多线程)之间的通信时的自定义消息。
Windows应用程序是消息驱动的。在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作。比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应。
一、消息:
1.标准Windows消息。除WM_COMMAND外以WM_开头的消息是标准消息。例如,WM_CREATE、WM_CLOSE。
2.命令消息。消息名为WM_COMMAND,消息中附带了标识符ID来区分是来自哪个菜单、工具栏按钮或加速键的消息。
3.通知消息。通知消息一般由列表框等子窗口发送给父窗口,消息名也是WM_COMMAND,其中附带了控件通知码来区分控件。
用户自定义消息是实际上就是用户定义一个宏作为消息,此宏的值应该大于等于WM_USER,然后此宏就可以跟系统消息一样使用,窗口类中可以定义它的处理函数。
二、消息映射表:
C++代码
1. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
2. ON_WM_CREATE()
3. ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
4. ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)
5. ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)
6. ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)
7. ON_WM_SETTINGCHANGE()
8. END_MESSAGE_MAP()
在BEGIN_MESSAG_MAP和END_MESSAGE_MAP之间的内容成为消息映射入口项。消息映射除了在CMainFrame的实现文件中添加消息映射表外,在类的定义文件MainFrm.h中还会添加一个宏调用:
DECLARE_MESSAGE_MAP()
一般这个宏调用写在类定义的结尾处。
三、添加消息处理函数
如何添加消息处理函数呢?不管是自动还是手动添加都有三个步骤:
1.在类定义中加入消息处理函数的函数声明,注意要以afx_msg打头。例如MainFrm.h中WM_CREATE的消息处理函数的函数声明:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);。
2.在类的消息映射表中添加该消息的消息映射入口项。例如WM_CREATE的消息映射入口项:ON_WM_CREATE()。
3.在类实现中添加消息处理函数的函数实现。例如,MainFrm.cpp中WM_CREATE的消息处理函数的实现:
intCMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
}
通过以上三个步骤以后,WM_CREATE等消息就可以在窗口类中被消息处理函数处理了。下面按照这三步来介绍自定义消息及其响应的过程。
本例实现子界面中点击按钮控制主界面中的功能。
1. 首先在resources.h或者stdafx.h中添加自定义消息:
#define WM_MY_MESSAGE1 (WM_USER+100)//自定义消息宏
#define WM_MY_MESSAGE2 (WM_USER+101)//自定义消息宏
#define WM_MY_MESSAGE3 (WM_USER+102)//自定义消息宏
#define WM_MY_MESSAGE4 (WM_USER+103)//自定义消息宏
#define WM_MY_MESSAGE5 (WM_USER+104)//自定义消息宏
2. 给子界面中的按钮添加一个按钮响应函数(其过程实际上也是添加一个消息响应机制)。在这个响应函数里添加如下代码,实现发送WM_MY_MESSAGE1消息至主界面。
CWnd *active = GetActiveWindow();
if (active!=NULL)
{
active->PostMessage(WM_MY_MESSAGE1,0,0);
}
3. 在主界面的消息映射表中添加消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
ON_WM_SIZE()
ON_WM_CREATE()
ON_MESSAGE_VOID(WM_MY_MESSAGE1,OnGorun) //添加消息映射
END_MESSAGE_MAP()
4. 在主界面的.h文件中添加该响应函数的声明,并在.cpp文件中添加定义。
afx_msg void OnGorun(WPARAM, LPARAM);
void CMainFrame::OnGorun(WPARAM wParam, LPARAM lParam)
{
inta=1,b=4;
a= a+b;
}