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 defineWM_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如果多个线程可以更改附加到文档的视图列表,则这不是线程安全的。