如何在WinApi/MFC中设计更干净的PostMessage链

如何在WinApi/MFC中设计更干净的PostMessage链,winapi,mfc,postmessage,Winapi,Mfc,Postmessage,我有一个MFC GUI应用程序,它有多个框架(有点像Outlook在主窗口中的行为,在新框架中创建消息/约会窗口,或者像Skype一样的多框架同步),我需要通过窗口层次结构发布消息 比方说,我得到字符串,_wcsdupit,PostMessage(WM_NEWSTRING,…),层次结构深处的某个控件对其进行处理,或者如果没有订阅者,则清除消息get 我现在研究的是,所有消息都发布到应用程序线程,线程找到活动帧或最佳匹配帧,将消息传递给它,帧将消息传递给它的视图,视图将消息传递给子视图,等等,如

我有一个MFC GUI应用程序,它有多个框架(有点像Outlook在主窗口中的行为,在新框架中创建消息/约会窗口,或者像Skype一样的多框架同步),我需要通过窗口层次结构发布消息

比方说,我得到字符串,_wcsdupit,PostMessage(WM_NEWSTRING,…),层次结构深处的某个控件对其进行处理,或者如果没有订阅者,则清除消息get

我现在研究的是,所有消息都发布到应用程序线程,线程找到活动帧或最佳匹配帧,将消息传递给它,帧将消息传递给它的视图,视图将消息传递给子视图,等等,如果没有视图来处理消息,它将获得自由

问题是,这些链接命令编写起来相当累人,因为我必须在我拥有的每个CWnd类中复制消息转发代码。同时,资源清理是相当令人不快的,因为如果没有窗口来捕获消息,就必须有人拨打免费电话。因此,简单地将消息发布到主消息泵而不进行额外处理,希望有人能够始终捕获它,这不是一种有效的方法。PostMessage返回S_OK,没有人认为该消息是可处理的,它处于悬空状态


对于我正在寻找的内容,有没有更好、正确的方法?

我永远不会像你所描述的那样使用
PostMessage
。我的解决方案通常包括握手:

// From CNotifierBlah
PostMesssage(hWnd, UWM_NEW_DATA, 0, 0);
//
LRESULT CDestinationWnd::OnNewData(WPARAM wParam, LPARAM lParam)
{
    CNewData newData = GetNotifierBlah().GetNewData(); // Thread-safe getter!
}

与几乎相同。

我永远不会像你描述的那样使用
PostMessage
。我的解决方案通常包括握手:

// From CNotifierBlah
PostMesssage(hWnd, UWM_NEW_DATA, 0, 0);
//
LRESULT CDestinationWnd::OnNewData(WPARAM wParam, LPARAM lParam)
{
    CNewData newData = GetNotifierBlah().GetNewData(); // Thread-safe getter!
}

与几乎相同。

没有理由不使用SendMessage,它解决了内存管理问题。很难理解为什么不使用方法调用。多线程。。。SendMessage是有效的序列化+上下文切换。如果您死心塌地地想使用此方法,为什么不在消息传递链的最末端添加一个消息接收器,以清理任何到此为止的消息?没有理由不使用SendMessage,它可以轻松解决内存管理问题。很难理解为什么不使用方法调用。多线程。。。SendMessage是一种有效的序列化+上下文切换。如果您死心塌地地地使用此方法,为什么不在消息传递链的最末端添加一个消息接收器,以清除任何到此为止的消息?我求助于接近的方法,但不完全是通过通知程序。我求助于接近的方法,但不完全是通过通知程序。