MFC:如何在将CView替换为窗格中有两个CView派生类的CSplitterWnd后修复MDI
我在MFC:如何在将CView替换为窗格中有两个CView派生类的CSplitterWnd后修复MDI,mfc,mdi,Mfc,Mdi,我在CChildFrame中创建了一个CSplitterWnd,并在其中添加了一个CScrollView和一个CListView作为基于。有没有教科书上的方法可以做到这一点?我这样问是因为我遇到了多个副作用,比如文档名称不再出现在应用程序标题栏中,或者鼠标滚轮不再适用于CScrollView 我想,我需要以某种方式重定向到达我的CChildFrame的消息,使我的CScrollView成为CView相关消息的默认接收者,因为cspllitterwnd中断了流,因为它不是从CView派生的。有人
CChildFrame
中创建了一个CSplitterWnd
,并在其中添加了一个CScrollView
和一个CListView
作为基于。有没有教科书上的方法可以做到这一点?我这样问是因为我遇到了多个副作用,比如文档名称不再出现在应用程序标题栏中,或者鼠标滚轮不再适用于CScrollView
我想,我需要以某种方式重定向到达我的CChildFrame
的消息,使我的CScrollView
成为CView
相关消息的默认接收者,因为cspllitterwnd
中断了流,因为它不是从CView派生的。有人能给我指出正确的方向吗
(注意:VS 2008仍会执行此操作。)
更新:我刚刚为应用程序窗口标题更新问题创建了一个单独的问题:这些代码示例不是最合适的,因为它们创建的是
CWnd
-派生窗格,而不是CView
-派生窗格。视图在某种程度上与文档没有关联。您需要调用CDocument::AddView()
方法,将创建的每个视图添加到文档的视图列表中。pContext
参数包含指向文档和其他成员的指针
将下面的代码放入文档类中,以验证视图是否已创建并与文档正确关联:
POSITION pos = GetFirstViewPosition();
while (pos)
{
CView *pVw = GetNextView(pos);
AfxMessageBox(typeid(*pVw).name(), MB_OK | MB_ICONINFORMATION);
}
此外,在每个视图类中:
CDocument *pDoc = GetDocument();
if (pDoc) AfxMessageBox(pDoc->GetTitle(), MB_OK | MB_ICONINFORMATION);
else AfxMessageBox("The view has no associated Document!");
注意:类的默认实现调用
CSplitterWnd::Create()
而不是CSplitterWnd::CreateStatic()
来创建拆分器窗口,如果将拆分器窗口移到最后,它将销毁视图中的窗格。然后,如果将其向后移动,它将使用文档模板或现有视图中的信息再次创建它们。如果最终创建了动态拆分器窗口,则可能也需要重写此行为。最好检查您正在使用的版本的MFC源。拆分器和视图之间似乎存在关于鼠标滚轮的历史冲突:
我不会将此标记为解决方案,因为我不完全理解背景,但目前这是一个解决方案:
BOOL CMyScrollViewDerivedClassInTheStaticSplitter::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// CSplitterWnd prohibits mousewheel somehow. Doing it explicitely here:
CPoint pos = GetScrollPosition();
pos.y -= zDelta;
ScrollToPosition(pos);
return CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}
我明确地需要一个静态拆分器,因为我有不同的视图。感谢您的回答,但是您可以从屏幕截图中看到,`
CDocument::AddView()
显然在某个地方被调用(使用与m_wndSplitter.CreateView()
一起传递的pContext),作为文档中显示的数据。也许要求一份教科书清单将拆分窗口无缝集成到子框架中要求太高了。即使是这篇好的教程也没有提供任何线索:--我想,我会在这里创建单独的问题来处理我遇到的每一个副作用。