关于拆分窗口的视图切换问题

gavingey 2008-09-16 10:38:23
如题,现有MDI程序PhotoJunct,该程序包含三个视图CPhotoJunctView、COriginalImgView和CJunctImgView,其中两个(CPhotoJunctView、COriginalImgView)在一个ChildFrame内(MDI默认的那个ChildFrame),作为拆分窗口的关联视图,代码如下:

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if ( !m_wndSplitter.CreateStatic(this, 2, 1) ||
!m_wndSplitter.CreateView(0, 0,
RUNTIME_CLASS( CPhotoJunctView),
CSize(0, 300), pContext ) ||
!m_wndSplitter.CreateView( 1, 0,
RUNTIME_CLASS(COriginalImgView),
CSize(0, 0), pContext))
{
return FALSE;
}

return TRUE;
}
而另外一个视图是一个独立的CScrollView,与另外一个ChildFrame关联,关联方式为在App中添加相应的Template,代码如下:
CPhotoJunctApp.h
CMultiDocTemplate* m_pSkeletonizeTemplate;
CMultiDocTemplate* m_pOriginalTemplate; // 二者在一个ChildFrame内,与拆分的窗口关联
CMultiDocTemplate* m_pJunctTemplate; // 独立视图
CPhotoJunctApp.cpp
...
// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接
//CMultiDocTemplate* m_pDocumentTemplate;
m_pSkeletonizeTemplate = new CMultiDocTemplate(IDR_PhotoJunctTYPE,
RUNTIME_CLASS(CPhotoJunctDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CPhotoJunctView));
if (!m_pSkeletonizeTemplate)
return FALSE;
AddDocTemplate(m_pSkeletonizeTemplate);

m_pOriginalTemplate = new CMultiDocTemplate(IDR_OriginalImgTYPE,
RUNTIME_CLASS( CPhotoJunctDoc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(COriginalImgView));
if (!m_pOriginalTemplate)
{
return FALSE;
}
AddDocTemplate( m_pOriginalTemplate );

m_pJunctTemplate = new CMultiDocTemplate( IDR_JunctImgTYPE,
RUNTIME_CLASS(CPhotoJunctDoc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CJunctImgView));
if ( !m_pJunctTemplate)
{
return FALSE;
}
AddDocTemplate(m_pJunctTemplate);
...
为了实现两个窗口(ChildFrame)的切换,在MainFrm内定义ActiveView函数如下:
void CMainFrame::ActiveView(CRuntimeClass* cNewView)
{
CView* pView = NULL;
CView* pTempView = NULL;

if ( !m_pDocument )
{
// 首次启动将document记录下来,以后使用不再改变
CMDIChildWnd* pChild = (CMDIChildWnd*)GetActiveFrame();
m_pDocument = (CPhotoJunctDoc*)(pChild->GetActiveDocument());
}

if ( !m_pDocument )
{
return;
}

// 遍历当前document的view
POSITION pos = m_pDocument->GetFirstViewPosition();
while ( pos != NULL )
{
pTempView = m_pDocument->GetNextView( pos );

if ( pTempView->IsKindOf(cNewView))
{
pView = pTempView;
break;
}
}

if ( pView )
{
// 如果View已经存在,则激活
pView->GetParentFrame()->ActivateFrame();
}
else
{
// View不存在,创建并激活
CPhotoJunctApp* pMyApp = (CPhotoJunctApp*)AfxGetApp();
CFrameWnd* pFrmWnd = NULL;

if ( cNewView == RUNTIME_CLASS( CJunctImgView ))
{
pFrmWnd = pMyApp->m_pJunctTemplate->CreateNewFrame(m_pDocument, (CFrameWnd*)pMyApp->GetMainWnd());
}

if ( pFrmWnd )
{
pFrmWnd->ActivateFrame();
}
else
{
return;
}
}
}
当调用该ActiveView函数进行视图切换时,第一次没有ChildFrame,于是创建新的ChildFrame(粉色代码),但此语句执行的结果似乎总是创建了一个与MDI默认的ChildFrame一样的子窗口,而且也是拆分的(代码跟踪到执行完粉色语句时,m_pDocument关联的ViewList有四个:分别是CPhotoJunctView、COriginalImgView和CPhotoJunctView、COriginalImgView)。
问题:为什么m_pJunctTemplate在App::InitInstance注册的是与CJunctImgView关联,但是在此处调用其CreateNewFrame方法创建的却是默认的ChildFrame(拆分窗口,关联两个视图)?
请问像这样一个ChildFrame是拆分窗口,关联两个视图,而另外一个单独的View关联另一个ChildFrame,如何实现两个ChildFrame的切换呢?像一般的视图切换一样??
谢谢各位大侠不吝赐教~
...全文
77 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
gavingey 2008-09-17
  • 打赏
  • 举报
回复
问题已解决,方法是在每次创建新的Frame(粉色代码)后,向Frame上的视图发送wm_initialupdate消息即可。
原因:为什么m_pJunctTemplate在App::InitInstance注册的是与CJunctImgView关联,但是在此处调用其CreateNewFrame方法创建的却是默认的ChildFrame(拆分窗口,关联两个视图)? 原因是创建的CChildFrame,
而CChildFrame的OnCreateClient已经修改为创建拆分窗口了。
方法是另外创建一个CChildFrame功能的容器,让拆分视图位于这个Frame内,而在DocTemplate中将这个Frame与View和Doc关联起来即可。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧