在MFC程序设计中,使用自定义消息通常有如下几种类型:
A. 自定义窗口消息
B. 自定义工具栏消息
C. 自定义菜单栏消息
D. 自定义右键菜单消息
1、自定义窗口消息
(1)、首先需要定义消息#define WM_XXXXXX WM_USER+X(此处最好使用WM_USER,而不要使用数字,以免与系统使用的发生重复冲突,X为没有使用过的数字);
(2)、在.h文件中DECLARE_MESSAGE_MAP()之前声明消息响应处理函数afx_msg LRESULT OnFunName(WPARAM wParam, LPARAM lParam);
(3)、在.cpp文件中实现消息处理函数
LRESULT ClassName::OnFunName(WPARAM wParam, LPARAM lParam)
{
return 0;
}
(4)、在.cpp文件中BEGIN_MESSAGE_MAP之后定义消息映射ON_MESSAGE(WM_XXXXXX,OnFunName);
(5)、发送消息调用响应函数 SendMessage(WM_XXXXXX, 0, 0)(如果有需要向响应函数传入参数,可以使用SendMessage函数的后两个参数);
2、自定义工具栏消息
(1)、首先在资源描述文件.rc文件中找到相应的工具栏描述文件
IDR_TOOLBAR1 TOOLBAR DISCARDABLE 41, 32
BEGIN
BUTTON ID_FILEOPEN
BUTTON ID_BUTTON32773
BUTTON ID_BUTTON32774
BUTTON ID_2DTRANSFORM
BUTTON ID_3DTRANSFORM
END
在资源描述文件中找到相应工具栏按钮,然后可以修改ID_XXXXXX(可以不修改,编程命名习惯而已,如果修改了,就做第(2),否则直接第(3)步);
(2)、在Resource.h中找到(1)中修改之前的的ID_XXXXXX,把这个 ID_XXXXXX也修改为(1)中修改过后的;
(3)、在.h文件中DECLARE_MESSAGE_MAP()之前声明消息响应处理函数afx_msgTYPE OnFunName();
(4)、在.cpp文件中实现消息处理函数
TYPE ClassName::OnFunName()
{
return;
}
(5)、在.cpp文件中BEGIN_MESSAGE_MAP之后定义消息映射ON_COMMAND(ID_XXXXXX,OnFunName);
(6)、直接单击工具栏上按钮,便可调用响应函数;
3、自定义菜单栏消息
(1)、首先在资源描述文件.rc文件中找到相应的菜单栏描述文件
IDR_MENU1 MENU DISCARDABLE
BEGIN
POPUP"文件(&F)"
BEGIN
MENUITEM "新建(&N)\tCtrl+N", ID_FILE_NEW
MENUITEM "打开(&O)...\tCtrl+O", ID_FILE_OPEN
MENUITEM "关闭(&C)", ID_FILE_CLOSE
END
在资源描述文件中找到相应菜单栏按钮,然后可以修改ID_XXXXXX(可以不修改,编程命名习惯而已,如果修改了,就做第(2),否则直接第(3)步);
(2)、在Resource.h中找到(1)中修改之前的的ID_XXXXXX,把这个ID_XXXXXX也修改为(1)中修改过后的;
(3)、后面的步骤与自定义工具栏消息完全一样;
4、自定义右键菜单消息
(1)、首先在资源描述文件.rc文件中找到相应的菜单栏栏描述文件
CG_IDR_POPUP_PROC_MAIN_IMAGE_VIEW MENUDISCARDABLE
BEGIN
POPUP "_POPUP_"
BEGIN
MENUITEM "原始尺寸", ID_EDIT_ORIN
MENUITEM "放大", ID_EDIT_ENLARGE
MENUITEM "缩小", ID_EDIT_SHRINK
MENUITEM "满窗口", ID_EDIT_FULL
END
然后做法与自定义菜单栏消息一样。
小结:MFC中经常使用的自定义消息就以上四种。总的来说,
a. 在自定义窗口消息中,重点要定义好消息ID,系统要通过ID来找到相应的消息处理函数;
b. 而在其余几种自定义消息中重要的是要找到对应按钮或控件的ID,我们在定义消息队列时,ON_COMMAND(ID, OnFunName)也是需要通过对于ID才能找到消息处理函数;
PS:
有时在使用自定义窗口消息的时候,我们通过SendMessage发送消息,希望得到消息处理函数的返回值,我们可以通过SendMessage函数的返回值得到。也就是说SendMessage函数的返回值就是消息处理函数的返回值。
有一篇资料中说到::SendMessage不能得到消息处理函数的返回值,这里的SendMessage返回值是发送消息函数本身执行是否成功。个人理解是MFC在封装过程中给Windows API做了一些修改,故在MFC中SendMessage能够得到消息处理函数的返回值。