您的位置:首页 > 其它

创建自己的窗口消息

2015-05-24 10:46 155 查看
步骤

1. 创建一个新的窗口消息

使用以下方式定义一个新的消息。若想定义多个消息,只要使用WM_USER的更大增量

即可。

# define WM_WZD_MESSAGE WM_USER+1

2. 发送一个新的窗口消息

利用SendMessage( )发送新消息:

AfxGetMainWnd( )-> SendMessage (WM_WZD_MESSAGE, wParam, lParam);

也可以自己定义存储在参数w P a r a m和l P a r a m中的值,二者都是DWORD变量。有两种方法来接收这个新窗口消息:第一种方法是增加ONMESSAGE宏和消息处理函数本身到接收消息类的消息映像中;第二种方法是为此新消息创建自己的消息映像宏。第一种的好处是快而且简单,第二种方法的好处是在消息进行处理之前用户可以定制wParam和lParam参数。如果想在整个应用程序中使用这个消息,这一点很重要。这两种方法都不能利用ClassWizard所提供的便利,因为新消息并不在ClassWizard的列表中。

3. 使用ON_MESSAGE( )接收新窗口消息

1) 使用文本编辑器,在接收消息的类中加入消息处理函数的定义。利用如下语法,并保

证是在ClassWizard的{{ }}框架之后,以防止ClassWizard删去这里所做的工作。

/ / { { A F X M S G ( C M a i n F r a m e )

/ / } } A F X M S G

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);<<<<

DECLARE_MESSAGE_MAP( )

2) 然后,在实现文件中,添加消息映像宏到消息映像中。

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)

/ / { { A F X M S G M A P ( C M a i n F r a m e )

/ / } } A F X M S G M A P

ON_MESSAGE ( WM_WZD_MESSAGE , OnMyMessage) < < < < <

END_MESSAGE_MAP( )

3) 最后,加入消息处理函数。

LRESULT CMainFrame::OnWzdMessage(WPARAM wParam, LPARAM lParam)

{

/ / p r o c e s s

return 0;

}

正如传送的w P a r a m和l P a r a m的值由你决定一样,该处理函数返回什么仍由你来决定。

4. 创建新的消息映像宏

1) 用如下方式为新消息定义一个新的消息映像宏,理想情况下,其定义在一个包含文件

中,以便可被应用程序的所有文件共享。

#define ON_WZD_MESSAGE() \

{WM_WZD_MESSAGE, 0, 0, 0, AfxSig_vW, (AFX_PMSG)(AFX_PMSGW)(void \

(AFX_MSG_CALL CWnd::*)(CWnd *))&OnWzdMessage},

AfxSig_vW的值告诉MFC新消息带一个指向CWnd类的指针,且返回值是Void类型。然后,

把正常情况下的w P a r a m和l P a r a m参数转换为调用参数。AfxSig _ vW的其他可用值,请参阅MFC子目录下AFXMSG . H文件。改变AfxSig_vW的值意味着改变这个宏定义的函数的调用参数。

2) 使用文本编辑器添加新消息处理函数的定义到接收消息类中。使用以下语法并保证是

在C l a s s Wi z a r d的{{ }}框架之后,以防止C l a s s Wi z a r d删去所做的工作。

/ / { { A F X M S G ( C M a i n F r a m e )

/ / } } A F X M S G

afx_msg void OnMyMessage(CWnd *pWnd);<<<<

D E C L A R E M E S S A G E M A P ( )

3) 在实现文件中,加入新消息映像宏到消息映像中。

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)

/ / { { A F X M S G M A P ( C M a i n F r a m e )

/ / } } A F X M S G M A P

ON_WZD_MESSAGE(WM_WZD_MESSAGE , OnMyMessage) < < < < <

END_MESSAGEMAP( )

4) 最后,加入新消息处理函数。

void CMainFrame::OnWzdMessage(CWnd *pWnd)

{

/ / p r o c e s s

}

记住,这里传递的参数不是通常的wParam和lParam,而是更友好的C W n d指针。

说明

■ 窗口消息的主要目的是窗口之间的内部消息处理,而不是处理诸如来自菜单的命令消息。

添加一个新的命令消息,则要定义一个新的命令I D,而不是使用W M C O M M A N D。

■ 添加任何内容到映像中时,应避免把代码放在{{ }}框架之间。否则C l a s s Wi z a r d会把它

删去。

/ / { { A F X M S G M A P ( C M a i n F r a m e )

<---- NOT HERE!!!

/ / } } A F X M S G M A P

ON_WZD_MESSAGE() <---- HERE!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: