如何创建用户定义的窗口消息





3.00/5 (7投票s)
2007年6月12日
2分钟阅读

38431

873
本文旨在理解和实现用户自定义窗口消息,以及如何通过消息传递参数。

引言
这是一个简单的应用程序,旨在帮助人们理解如何创建自己的窗口消息。我的主要目的是提供窗口消息的基本理解,以及如何在您的应用程序中实现它。
背景
当我们谈论窗口消息时,有两种发送消息的方式。所有这些消息都通过消息队列传递。这保证了附加到窗口消息的每个函数调用不会同时执行。所以这两种方式是:
- Post
PostMessage 在消息调用发送到消息队列后立即返回,它不会等待消息执行其附加的函数。 - 发送
SendMessage 仅在其执行附加的函数后返回。
使用代码
ON_MESSAGE 与 ON_REGISTERED_MESSAGE
ON_MESSAGE 和 ON_REGISTERED_MESSAGE 将执行几乎相似的功能,但用法不同。以上函数需要两个参数。
参数
message
消息 ID。
memberFxn
消息映射到的消息处理函数的名称。
如果程序员使用他自己定义的值作为消息 ID,那么 ON_MESSAGE 将变为有效函数调用。
但这并不能保证用户定义的值作为消息 ID 在应用程序中是唯一值,这会导致更多问题。
为了获得唯一值,用户可以使用以下语句:
要获得唯一值,用户可以使用以下语句。
static const UINT UWM_CALL_MSG_WITH_PARAMETERS = ::RegisterWindowMessage(_T("UWM_CALL_MSG_WITH_PARAMETERS"));
RegisterWindowMessage() 将返回一个唯一值。如果程序员从这个函数派生了他的消息 ID,他必须使用 ON_REGISTERED_MESSAGE 函数。
来自此函数,他必须使用 ON_REGISTERED_MESSAGE 函数。如果您需要更多关于这些的信息,请参考 MSDN 在线文档。
有关这些的更多信息,请参阅 MSDN 在线文档。
当你定义一个消息函数时,你必须使用以下语法。
LRESULT onClickCallWindowMessages(WPARAM wParam, LPARAM lParam);
在您的应用程序消息映射中,您必须将用户定义的消息 ID 与函数映射如下。
如下。
BEGIN_MESSAGE_MAP(CwindowMsgExDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON_SHOW, OnBnClickedButtonShow)
ON_REGISTERED_MESSAGE(UWM_ON_CLICK_SHOW_BUTTON,onClickCallWindowMessages)
ON_REGISTERED_MESSAGE(UWM_CALL_MSG_WITH_PARAMETERS,onCallWindowMessageWithParameters)
ON_BN_CLICKED(IDC_BUTTON_CALL_WITH_PARAM, OnBnClickedButtonCallWithParam)
END_MESSAGE_MAP()
在我的演示应用程序中,它演示了如何触发用户定义窗口消息,以及如何通过窗口消息传递参数。
通过窗口消息传递参数,您应该在堆上分配它,因为它不是另一个函数调用,当消息被调用时,局部变量的作用域会丢失,所以你应该在堆中创建它,并将引用传递给消息函数。
应该在堆上分配它,因为它不是另一个函数调用,当消息被调用时,局部变量的作用域会丢失,所以你应该在堆中创建它,并将引用传递给消息函数。
消息函数。
消息函数。
m_ctrlCHECKWithParam.EnableWindow(true); m_ctrlCHECKWithParam.SetCheck(BST_CHECKED); m_lEDITInWParam = *(long*)wParam; m_strEDITInLParam = *(CString*)lParam; UpdateData(false); delete (long*)wParam; delete (CString*)lParam;
您有责任在消息函数中删除在头中创建的变量。
m_ctrlCHECKWithParam.EnableWindow(true); m_ctrlCHECKWithParam.SetCheck(BST_CHECKED); m_lEDITInWParam = *(long*)wParam; m_strEDITInLParam = *(CString*)lParam; UpdateData(false); delete (long*)wParam; delete (CString*)lParam;
我希望您能从这段代码中受益。将来我打算提交更多高级编程示例来帮助您。希望你喜欢这个。
提交更多高级编程示例来帮助您。希望你喜欢这个。