MFC自定义消息

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.hWM_CREATE的消息处理函数的函数声明:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

       2.在类的消息映射表中添加该消息的消息映射入口项。例如WM_CREATE的消息映射入口项:ON_WM_CREATE()

       3.在类实现中添加消息处理函数的函数实现。例如,MainFrm.cppWM_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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bjtuwayne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值