Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MFC-如何向从CView类派生的所有视图发布消息?_Mfc_Message - Fatal编程技术网

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

MFC-如何向从CView类派生的所有视图发布消息?,mfc,message,Mfc,Message,我想向所有视图发布一条消息。 我正在考虑获取一个文档全局引用,然后实现如下方法 void SomeAppDoc::DispatchToAll( UINT msg, WPARAM wP, LPARAM lP ) { //some how get all view's reference //iterate and update each views } 有效的方法是什么?最简单的方法是调用,它调用附加到文档的每个视图的函数 如果确实需要向每个视图发布消息,而不是调用OnUpdate,请

我想向所有视图发布一条消息。 我正在考虑获取一个文档全局引用,然后实现如下方法

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

有效的方法是什么?

最简单的方法是调用,它调用附加到文档的每个视图的函数

如果确实需要向每个视图发布消息,而不是调用
OnUpdate
,请执行类似于
updatealviews
的操作:

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

我希望这有帮助

我也遇到过类似的问题,但我发现提供的答案不够充分,因为这个问题的解决方案有两个部分

第一个是迭代各种视图并使用
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 define
WM_APP
在用户定义的消息ID范围内创建一个唯一的消息标识符(与标准Windows消息ID相反),以发送一条消息,指示要用作
PostMessage()
WPARAM
参数的偏移量。请参见哪些国家:

用户定义的消息是非标准窗口的任何消息 WM_消息消息。选择消息ID时,必须使用值 在WM_用户(0x0400)到0x7FFF或WM_应用程序(0x8000)到 0xbff。有关消息ID的更多信息,请参阅

CView
类中,我为
CView
类的消息映射添加了一个条目。我正在使用
ON_MESSAGE
而不是
ON_命令
,因为我需要为处理消息的
CView提供偏移量

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

LRESULT CPCSampleView::OnWindowSetSection(WPARAM  wParam, LPARAM  lParam)
{
    CPCSampleDoc *pDoc = GetDocument();

    CPoint  ptOrigin;
    ptOrigin = GetScrollPosition();

    wParam *= m_sizeCell.cy;    // multiple text line offset by height of each line of text
    ptOrigin.y = wParam;        // change the vertical position of the scroll bar

    ScrollToPosition(ptOrigin);   // move the scroll bar elevator

    this->UpdateWindow();     // tell view to update displayed window to match elevator position

    return 0;
}

有关邮件的详细信息,请参阅Microsoft文档。

与@chris posted类似,GetDocument()->UpateAllViews是一种有效的方法。据我所知,GetDocument()->UpdateAllViews()不是线程安全的。@webnoon如果多个线程可以更改附加到文档的视图列表,则这不是线程安全的。