MFC中自定义消息方法及如何得到消息处理函数的返回值

在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能够得到消息处理函数的返回值。


版权声明:本文为no_Talent原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。