自定义消息

自定义消息的响应和资源消息的响应有很多类似之处;资源消息的响应是以资源的ID号作为标识的;自定义的消息要自己声明消息ID。

一.           定义:

第一步要声明消息:

#define WM_MYMSG  WM_USER+200

第二步要在类声明中声明消息映射:

DECLARE_MESSAGE_MAP()

第三步要在类声明中定义消息处理函数:

afx_msg LRESULT MyMsgHandler(WPARAM,LPARAM);

在.cpp中做的工作:

第四步要实现消息映射:

BEGIN_MESSAGE_MAP()

ON_MESSAGE(WM_MYMSG,OnMyMsgHandler)

END_MESSAGE_MAP()

第五步要实现消息处理函数(当然可以不实现):

LRESULT CMainFrame::OnMyMsgHandler(WPARAM w,LPARAM l)

{

AfxMessageBox("Hello,World!");

return 0;

}

二.           使用

1.      如果该自定义消息所在的类是有CWnd派生出来的,且在本类中调用,那么我们可以调用CWnd::SendMessage()函数,具体定义为:

LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );

此时我们只需要在引发消息的地方添加如下代码:

SendMessge(WM_MYMSG,0,0);

如果我们想在不同的情况下发送用户消息,我们只需要将SendMessage的后两个参数wParam,lParam加以标识即可;在消息处理函数,写一个if条件语句(或switch语句)就可以了;将不同情况下的用户消息区分开;

  例如看下面的例子:  

  ①加入消息响应函数实现
  在CCDlg类的实现文件中加入消息响应函数的实现部分,代码如下:

 

  void CCDlg::Customize(WPARAM wParam, LPARAM lParam)

  {

        CString strTittle;

        strTittle.Format("自定义消息参数:x=%d,y=%d",wParam,lParam);

        SetWindowText(strTittle);

  }

  此函数的作用是将鼠标的位置信息显示在对话框的标题栏部分。

  ②.菜单部分
  在主框架的“帮助”主菜单中加入“自定义消息”子菜单,其ID设为ID_CUSTOMIZE,通过类向导响应该命令,函数名默认。其函数体如下:

 

  void CMainFrame::OnCustomize()

  {

        // TODO: Add your command handler code here

        POINT pos;

        //将消息参数定义为屏幕坐标值

        GetCursorPos(&pos);

        pdlg->SendMessage(WM_CUSTOMIZE,(UINT)pos.x,pos.y);//这里就是将(UINT)pos.x,pos.y(注:它们分别对应①中消息响应函数的两个参数WPARAM     wParam和LPARAM lParam)两个参数分别传给消息响应函数。

  }

 

2.      如果不在本类中响应自定义消息;那么我们只能用win32 的API函数;例如,当自定义消息在CMainFrame中,而触发消息的地方不在CMainFrame类中,那么我们可以用如下语句:

::SendMessge(::AfxGetMainWnd()->m_hWnd,WM_MYMSG,0,0);

 

 

相关内容网址:

http://www.cnblogs.com/smartvessel/archive/2011/07/18/2109472.html

http://blog.csdn.net/penpenandtongtong/article/details/18598907

http://www.oschina.net/question/565065_72596

http://blog.chinaunix.net/uid-24459558-id-299010.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值