0

我想在 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);
}

这样的事情可能吗?

4

3 回答 3

1

通过 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 中分配数组并按照建议在 OnCustomStringMessage 中删除它通过user2173190的回答。

于 2013-03-25T10:03:45.420 回答
0

尝试使用 WM_USER 消息作为您的自定义消息,并通过覆盖它在 OnMessage 方法中处理它。要了解 WM_USER 消息,请参阅此处

于 2013-03-25T08:33:44.290 回答
0

如果向异步消息函数(PostMessage、SendNotifyMessage 和 SendMessageCallback)发送 WM_USER 以下范围内的消息,则其消息参数不能包含指针。否则,操作将失败。这些函数将在接收线程有机会处理消息之前返回,并且发送者将在使用之前释放内存。

PostMessage 的消息参数可以包含指针 您可以包含指针作为参数。将它们转换为整数,不要在触发 PostMessage 的线程或函数上释放或释放它们,而是在接收线程或函数上释放或释放它们。只需确保在使用指针时,您只对一条消息使用一种指针类型,不要将指向不同对象的指针与相同的消息混合。

http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms644944(v=vs.85).aspx

于 2013-03-25T09:01:51.220 回答