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

时间:2010-11-15 14:19:38

标签: winapi mfc postmessage

我有一个MFC GUI应用程序,它有多个框架(有点像Outlook的行为主窗口,消息/预约窗口是在新的框架中创建的,或Skype像多帧同步),我需要PostMessage malloc '通过窗口层次结构编辑数据。

说,我得到字符串,_wcsdup它,PostMessage(WM_NEWSTRING,...),并且层次结构深处的控件处理它,或者如果没有订阅者,则消息被清除。

我现在正在研究的是,所有消息都发布到应用程序线程,线程找到活动帧或最适合的帧,将消息传递给它,帧将消息传递给它的视图,视图将消息传递给子视图等等,如果没有处理消息的视图,它就会被释放。

问题是这些链接命令很难写,因为我必须在每个CWnd类中复制消息转发代码。同时,资源清理是非常不愉快的,因为如果没有窗口来捕获消息,有人必须调用免费。因此,只需将消息发布到主消息泵而无需额外处理,希望有人总能捕获它,这不是一种有效的方法。 PostMessage返回S_OK,没有人看到该消息是可处理的,并且它是悬空的。

对于我正在寻找的东西,是否有更好,更正确的方法?

1 个答案:

答案 0 :(得分:1)

我绝不会像你描述的那样使用PostMessage。我的解决方案通常涉及握手:

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

Observer pattern几乎相同。