gpt4 book ai didi

c++ - mfc - 带有自定义参数的发送消息/邮寄消息

转载 作者:行者123 更新时间:2023-11-28 07:42:09 26 4
gpt4 key购买 nike

我想在 MFC 中有一个消息处理程序,它接受我在消息映射中定义的任何参数。

例如,

static UINT UWM_STATUS_MSG = RegisterWindowMessage("Status message");
static UINT UWM_GOT_RESULT= RegisterWindowMessage("Result has been obtained");

//{{AFX_MSG(MyClass)
afx_msg void OnCustomStringMessage(LPCTSTR);
afx_msg void OnStatusMessage();
//}}AFX_MSG


BEGIN_MESSAGE_MAP(MyClass, CDialog)
//{{AFX_MSG_MAP(MyClass)
ON_REGISTERED_MESSAGE(UWM_STATUS_MSG, OnStatusMessage)
ON_REGISTERED_MESSAGE(UWM_GOT_RESULT, OnCustomStringMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void MyClass::OnCustomStringMessage(LPCTSTR result)
{
m_result.SetWindowText(result);
}

void MyClass::OnStatusMessage()
{
// Do something
}

DWORD WINAPI MyClass::thread(LPVOID lParam)
{
char result[256] = { 0 };
SendMessage(UWM_STATUS_MSG);

// Do some stuff and store the result

PostMessage(UWM_GOT_RESULT, result);
}

这样的事情可能吗?

最佳答案

通过 ON_MESSAGE 或 ON_REGISTERED_MESSAGE 调用的成员函数的签名必须是:

afx_msg LRESULT OnMyFunction(WPARAM p1, LPARAM p2);

您必须使用转换运算符来处理这个问题。

因此你应该这样写:

...
afx_msg LRESULT OnCustomStringMessage(WPARAM p1, LPARAM p2);
...

LRESULT MyClass::OnCustomStringMessage(WPARAM p1, LPARAM p2)
{
LPCTSTR result = (LPCTSTR)p1 ;
m_result.SetWindowText(result);
}

DWORD WINAPI MyClass::thread(LPVOID lParam)
{
static char result[256] = { 0 }; // we need a static here
// (see explanations from previous answers)
SendMessage(UWM_STATUS_MSG);

// Do some stuff and store the result

PostMessage(UWM_GOT_RESULT, (WPARAM)result);
}

如果 MyClass::thread 打算从几个不同的线程调用,您需要以更复杂的方式处理结果数组,只需将其声明为静态,例如在 MyClass 中分配数组::thread 并按照 user2173190 的回答建议在 OnCustomStringMessage 中删除它。

关于c++ - mfc - 带有自定义参数的发送消息/邮寄消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15610390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com