MFC,怎么实现,单文档,多视图?

Cpp初学者 2019-09-05 08:50:23
假设我有一种复合文档,里面可能包含多种子文档,比如txt文字信息,图片,等等各种子文档种类

而一个复合文档里,可能包含多个或者没有包含某种子文档。(我会提供接口给用户动态添加或删除)

就变成一个单文档,多视图的问题了。

希望只能同时打开一个复合文档,用mdi窗口的形式把里面的子文档展示出来。

我看到MFCwindows程序设计,569页,有提到
“如果想给用户在应用程序实例中提供同时编辑几个文档的能力,那么多文档界面并不是您唯一的选择。The Windows Interface Guidelines for Software Defign 列出了除MDI程序设计模型以外的3种可选模型:”

分别是:基于工作区的模型(如Visual C++),工作手册模型,项目模型

“但是MFC并不直接支持任何一种选项”

然后,书上只是提到,并且是提到另一本书提到,没有讲解该怎么做。

我想来想去,大概只有重写大量的虚函数,才能实现吧。

大概这个基于工作区的模型,正是我想要的,mdi窗口的方式展示,切换。

所以:问问大家有没有搞好的现成的模型,或者清晰的思路。
...全文
352 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2019-09-07
  • 打赏
  • 举报
回复
用MDI还切换什么!
schlafenhamster 2019-09-07
  • 打赏
  • 举报
回复
"用mdi窗口的形式把里面的子文档展示出来"
1 用 MDI
2 打开 所有 view
3 平铺 所有 view
Cpp初学者 2019-09-07
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
用MDI还切换什么!
我说用MDI的方式,给用户切换,展示
schlafenhamster 2019-09-06
  • 打赏
  • 举报
回复

void CMainFrame::OnSwitchViews() // button
{
// TODO: Add your command handler code here
CView *pOldView=(CView *)GetActiveView();
//CHexView
if(pOldView->IsKindOf(RUNTIME_CLASS(CWinOh51View)))
{
SwitchViews(2);//CFormatView
}
else if (pOldView->IsKindOf(RUNTIME_CLASS(CFormatView)))
{
SwitchViews(3);//CFlashView
}
else if (pOldView->IsKindOf(RUNTIME_CLASS(CFlashView)))
{
SwitchViews(4);//CHexView
}
else //(pOldView->IsKindOf(RUNTIME_CLASS(CHexView)))
{
SwitchViews(1);//CWinOh51View
}
}
//
// CMainFrame message handlers
void CMainFrame::SwitchViews(int ID)
{
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView;
CCreateContext cc;
cc.m_pCurrentDoc=pOldActiveView->GetDocument();
CString title=cc.m_pCurrentDoc->GetPathName();;
// which one
switch (ID)
{
case 1://
pNewActiveView=(CView*) new CWinOh51View;
title += " Binary View";
break;
case 2://
pNewActiveView=(CView*) new CFormatView;
title += " Formated View";
break;
case 3://
pNewActiveView=(CView*) new CFlashView;
title += " Flash View";
break;
case 4://
pNewActiveView=(CView*) new CHexView;
title += " Hex View";
break;
}
// Create new
pNewActiveView->Create(0,0,0,CFrameWnd::rectDefault,this,ID,&cc);
pNewActiveView->OnInitialUpdate();
SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
// Exchange view's window ID so RecalcLayout() works.
SetWindowLong(pNewActiveView->m_hWnd, GWL_ID,AFX_IDW_PANE_FIRST);
RecalcLayout();
//If we use: delete pOldActiveView,
//we got : Warning: calling DestroyWindow in CWnd::~CWnd,
//OnDestroy or PostNcDestroy in derived class will not be called.
pOldActiveView->DestroyWindow();
// new title
SetWindowText(title);
}

Cpp初学者 2019-09-06
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:

void CMainFrame::OnSwitchViews() // button
{
// TODO: Add your command handler code here
CView *pOldView=(CView *)GetActiveView();
//CHexView
if(pOldView->IsKindOf(RUNTIME_CLASS(CWinOh51View)))
{
SwitchViews(2);//CFormatView
}
else if (pOldView->IsKindOf(RUNTIME_CLASS(CFormatView)))
{
SwitchViews(3);//CFlashView
}
else if (pOldView->IsKindOf(RUNTIME_CLASS(CFlashView)))
{
SwitchViews(4);//CHexView
}
else //(pOldView->IsKindOf(RUNTIME_CLASS(CHexView)))
{
SwitchViews(1);//CWinOh51View
}
}
//
// CMainFrame message handlers
void CMainFrame::SwitchViews(int ID)
{
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView;
CCreateContext cc;
cc.m_pCurrentDoc=pOldActiveView->GetDocument();
CString title=cc.m_pCurrentDoc->GetPathName();;
// which one
switch (ID)
{
case 1://
pNewActiveView=(CView*) new CWinOh51View;
title += " Binary View";
break;
case 2://
pNewActiveView=(CView*) new CFormatView;
title += " Formated View";
break;
case 3://
pNewActiveView=(CView*) new CFlashView;
title += " Flash View";
break;
case 4://
pNewActiveView=(CView*) new CHexView;
title += " Hex View";
break;
}
// Create new
pNewActiveView->Create(0,0,0,CFrameWnd::rectDefault,this,ID,&cc);
pNewActiveView->OnInitialUpdate();
SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
// Exchange view's window ID so RecalcLayout() works.
SetWindowLong(pNewActiveView->m_hWnd, GWL_ID,AFX_IDW_PANE_FIRST);
RecalcLayout();
//If we use: delete pOldActiveView,
//we got : Warning: calling DestroyWindow in CWnd::~CWnd,
//OnDestroy or PostNcDestroy in derived class will not be called.
pOldActiveView->DestroyWindow();
// new title
SetWindowText(title);
}


MSDN里也给出了一个switchview,但是不是我想要的,我想要MDI窗口的方式展示
走好每一步 2019-09-06
  • 打赏
  • 举报
回复
觉得MFC的单文档和多文档有点傻。。。 个人只喜欢用对话框

15,978

社区成员

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

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