65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2007年6月12日

2分钟阅读

viewsIcon

38431

downloadIcon

873

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

Screenshot - WindowMsgEx.jpg

引言

这是一个简单的应用程序,旨在帮助人们理解如何创建自己的窗口消息。我的主要目的是提供窗口消息的基本理解,以及如何在您的应用程序中实现它。

背景

当我们谈论窗口消息时,有两种发送消息的方式。所有这些消息都通过消息队列传递。这保证了附加到窗口消息的每个函数调用不会同时执行。所以这两种方式是:

  • 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;

我希望您能从这段代码中受益。将来我打算提交更多高级编程示例来帮助您。希望你喜欢这个。
提交更多高级编程示例来帮助您。希望你喜欢这个。

如何创建用户自定义窗口消息 - CodeProject - 代码之家
© . All rights reserved.