创建自己的窗口消息
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!!!!
版权声明: