MFC - 如何将消息发布到从CView类派生的所有视图?

时间:2012-01-05 09:36:47

标签: mfc message

我想在所有观看中发布消息。 我正在考虑获取Document全局引用,然后实现类似下面的方法

void SomeAppDoc::DispatchToAll( UINT msg, WPARAM wP, LPARAM lP )
{
  //some how get all view's reference
  //iterate and update each views 
}

有效的方法是什么?

2 个答案:

答案 0 :(得分:2)

最简单的方法是调用CDocument::UpdateAllViews,它会调用附加到文档的每个视图的OnUpdate函数。

如果您确实需要向每个视图发布消息,而不是致电OnUpdate,请执行与UpdateAllViews类似的操作:

void SomeAppDoc::DispatchToAll(UINT msg, WPARAM wParam, LPARAM lParam)
{
    POSITION pos = GetFirstViewPosition();
    while (pos != NULL)
    {
        CView* pView = GetNextView(pos);
        pView->PostMessage(msg, wParam, lParam);
    }
}

我希望这有帮助!

答案 1 :(得分:0)

我遇到了类似的问题,但是我发现此提供的答案不足,因为该问题的解决方法有两个部分。

第一种方法是遍历各个视图并使用PostMessage()向每个视图发送消息的过程。

第二部分是在CView端正在做的事情,它正在接收正在发送的消息,我想在此部分提供一些说明。

在我正在使用的MFC应用程序中,我想向CView发送消息,但由于我对如何处理发送的消息存在错误而遇到了异常。

在从CDocument派生的类中,我有一个函数遍历CView对象的列表,以向每个对象发送消息。在这种特殊情况下,我想将视口重新定位到报表的指定部分。这要求发送的Windows消息包括偏移量值和消息标识符。

        POSITION pos = GetFirstViewPosition();
        while (pos != NULL)
        {
            CView* pView = GetNextView(pos);
            if (pView)
                pView->PostMessage(WM_APP + 10, sectionHeader.m_ListOffset, 1);
        }

我正在使用标准Windows SDK定义WM_APP在用户定义的消息ID(与标准Windows消息ID相对)范围内创建唯一的消息标识符,以发送指示偏移量的消息,以用作WPARAM的{​​{1}}自变量。请参见Message Map Macros - ON_MESSAGE,其中指出:

  

用户定义的消息是非标准Windows的任何消息   WM_MESSAGE消息。选择消息ID时,必须使用值   在WM_USER(0x0400)到0x7FFF或WM_APP(0x8000)的范围内   0xBFFF。有关消息ID的更多信息,请参见WM_APP

PostMessage()类中,我为CView类的消息映射添加了一个条目。我使用CView而不是ON_MESSAGE,因为我需要为处理消息的ON_COMMAND提供偏移量。

CView

,然后添加实际消息处理程序本身的源,该消息处理程序通过使用缓冲区中文本行的偏移以及每个文本行的行高来计算正确的视口滚动位置:

ON_MESSAGE(WM_APP + 10, &CPCSampleView::OnWindowSetSection)

有关消息的更多详细信息,请参阅Microsoft文档中的Message Handling and Mapping