利用MFC消息映射机制自定义消息

粘贴自百度文库

#define WM_MyMessage (WM_USER + n)

n为数字到少大于100
或者用 const UINT WM_MYMESSAGE = WM_USER + n
一般可以加在stdafx.h 或resource.h 或*.app.h中。
他们都是全局变量头文件所以都可以.

2. 在所在类的*.H文件增加消息函数声明.


protected:
//{{AFX_MSG(CChildView)

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

3.在所在类的实现文件*.CPP文件中增加消息映射 和实现消息处理函数

BEGIN_MESSAGE_MAP(CChildView,CWnd )
//{{AFX_MSG_MAP(CChildView)

ON_MESSAGE(WM_MyMessage, OnMyMessage)

//}}AFX_MSG_MAP
END_MESSAGE_MAP()


也就是说WM_MyMessage消息对应OnMyMessage函数

LRESULT 类名::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
return 0;
}

4. 以后就可以随时


SendMessage(WM_MyMessage,wPARAM,lPARAM);

 

 

用户可以为了特定的目的而定义自己的消息,这些消息也称为自定义消息。进行自定义消息的方法很简单,一般有两种:一种是利用ON_MESSAGE宏,另外一种就是创建自己的消息映射宏,这一种方法可以定制消息的参数类型,而不像前者只能使用固定的消息参数类型。但是一般情况下不需要定制消息的参数类型,因此这里对此不予介绍。本节主要介绍第一种比较常用的方法。

预定义常量值WM_USER(0x0400)是系统专门用来为实现处理用户自定义的消息而提供的接口,需要自定义消息时,只需要以如下形式定义即可:

 

WM_USER+X

 

其中X是一个非负整数值。另外,需要注意的是,用户自定义消息的值范围是有规定的,如6.1.3小节所述,其值介于WM_USER和0x7FFF之间,所以,为X取值时应该注意这个问题。下面结合具体的实例来详细介绍自定义消息的实现方法。

1.自定义消息WM_CUSTOMIZE
首先,在CCDlg类的头文件中加入如下代码:

 

#define WM_CUSTOMIZE  WM_USER+1

 

其中WM_CUSTOMIZE即是所要定义的消息。然后,仍在头文件中加入Customize的声明:

 

    // Generated message map functions

    //{{AFX_MSG(CCDlg)

    afx_msg void OnCmd();

    //}}AFX_MSG

    afx_msg void Customize(WPARAM wParam, LPARAM lParam);

    DECLARE_MESSAGE_MAP()

 

此时,需要注意的是加入的位置一定要在类向导的“//{{”和“//}}”注释之外,不然类向导会删除开发人员添加的内容。这里所加入的内容即是消息响应函数的声明部分,其中,两个参数分别表示鼠标的屏幕坐标位置。

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

 

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

{

      CString strTittle;

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

      SetWindowText(strTittle);

}

 

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

3.菜单部分
在主框架的“帮助”主菜单中加入“自定义消息”子菜单,其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);

}

 

4.文件包含和编译
将CCDlg头文件包含到主框架实现文件中即可,编译运行,可以通过菜单命令响应,注意观察对话标题栏部分的变化。

自定义消息在程序设计中经常用到,但由于实现起来比较简单,这里就不再赘述。

posted @ 2012-10-30 09:15  m_sk  阅读(332)  评论(0)    收藏  举报