2024年6月7日发(作者:)
VC中自定义消息的方法
2009-07-13 17:22
第一:
简易版本:
定义一个自定义消息号:const UINT WM_MYMESSAGE = WM_USER + n; // 自定义
消息一般大于WM_USER
,然后就可以为该消息添加映射了
afx_msg LRESULT OnMyMessage ( WPARAM wParam, LPARAM lParam );
ON_MESSAGE ( WM_MYMESSAGE, OnMyMessage )
LRESULT cxx::OnMyMessage ( WPARAM wParma, LPARAM lParam )
{
...
}
如果该消息不需要返回值,也不需要参数,那么可以使用宏ON_MESSAGE_VOID
来映射
afx_msg void OnMyMessage ();
ON_MESSAGE_VOID ( WM_MYMESSAGE, OnMyMessage )
void cxx::OnMyMessage ()
{
...
}
复杂全面版本:
消息映射、循环机制是Windows程序运行的基本方式。VC++ MFC 中有许多现成
的消息句柄,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困
难。在MFC ClassWizard中不允许添加用户自定义消息,所以我们必须在程序中
添加相应代码,以便可以象处理其它消息一样处理自定义消息。通常的做法是采
取以 下步骤:
第一步:定义消息。
推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用
WM_USER消息。
#define WM_MY_MESSAGE (WM_USER+100)
第二步:实现消息处理函数。
该函数使用WPRAM和LPARAM参数并返回LPESULT。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
...
return 0;
}
第三步:在类头文件的AFX_MSG块中说明消息处理函数:
class CMainFrame:public CMDIFrameWnd
{
...
// 一般消息映射函数
protected:
// {{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函
数中。
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
如果用户需要一个定义整个系统唯一的消息,可以调用SDK函数
RegisterWindowMessage定义消息:
static UINT WM_MY_MESSAGE=RegisterWindowMessage("User");
并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同
上。
当需要使用自定义消息时,可以在相应类中的函数中调用函数PostMessage
或SendMessage发送消息PoseMessage(WM_MY_MESSAGE,O,O); 如果向其他进程
发送消息可通过如下方法发送消息:
DWORD result;
SendMessageTimeout(wnd->m_hWnd, // 目标窗口
WM_MY_MESSAGE, // 消息
发布评论