MFC学习之路(七)实现多文档的单文档多视图

新建一个多文档应用程序假设名字为123

新建一个MFC类,派生于CView,命名为CViewTest
然后重载一个虚拟函数
void CViewTest::OnInitialUpdate()
{
CView::OnInitialUpdate();

// TODO: 在此添加专用代码和/或调用基类
GetParent()->SetWindowText(_T("测试视图")); // 设置选项卡标题
}

在应用程序类C123中创建一个公有成员变量
CMultiDocTemplate* m_pDocTemp1;

在应用程序类的源文件中添加ViewTest.h头文件
在BOOL C123::InitInstance()函数中
找到如下语句
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_My123TYPE, // 改为IDR_MAINFRAME
RUNTIME_CLASS(CMy123Doc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CMy123View));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);

然后我们把它改为
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,
RUNTIME_CLASS(CMy123Doc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CMy123View));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
应为不改变IDR_My123TYPE的话,多的视图时,他会让你选择哪个文档,而实际上我们只有一个文档。

在这些语句的下方添加
m_pDocTemp1 = new CMultiDocTemplate(IDR_MAINFRAME,
RUNTIME_CLASS(CMy123Doc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CViewTest));
if (!m_pDocTemp1)
return FALSE;
AddDocTemplate(m_pDocTemp1);

然后在CMainFrame.cpp中添加ViewTest.h头文件
再添加一个函数
//创建视图
void CMainFrame::SwitchToView(CDocTemplate* pTemplate, CRuntimeClass* pViewClass)
{
//获得活动子窗口
CMDIChildWnd *pMDIActive = MDIGetActive();
if (pMDIActive == NULL) 
{
pTemplate->OpenDocumentFile(NULL);
pMDIActive = MDIGetActive();
}

//获得活动doc
CDocument *pDoc = pMDIActive->GetActiveDocument(); 
if (pDoc == NULL) 
return; 

//查询此doc下的所有已创建view
CView *pView;
POSITION pos = pDoc->GetFirstViewPosition();       
while (pos != NULL)
{
pView = pDoc->GetNextView(pos);
if (pView->IsKindOf(pViewClass))           //如果已创建此view 则设其为活动
{
//the requested view class has already been created; show it
pView->GetParentFrame()->ActivateFrame();  

pView->UpdateWindow();//视图更新显示;
pView->Invalidate();  //再刷新才可以
return;
}
}

//如果没有创建,则创建此view的childframe及view
CMDIChildWnd *pNewFrame = (CMDIChildWnd *)pTemplate->CreateNewFrame(pDoc, NULL);  
if (pNewFrame == NULL)
return;

pTemplate->InitialUpdateFrame(pNewFrame, pDoc);
}

再在IDR_MAINFRAME下添加一个菜单,假设菜单ID为ID_TEST,添加消息响应

void CMainFrame::OnTest()
{
// TODO: 在此添加命令处理程序代码
SwitchToView(theApp.m_pDocTemp1, RUNTIME_CLASS(CViewTest));
}

新选项卡弹出来了,可是标题没变,咋办?
在CChildFrm类的虚函数BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs);
中添加cs.style &=~(LONG)FWS_ADDTOTITLE;  他去除了自动添加窗口标题,这样我们就可以自由修改啦!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC文档应用程序中,文件视图导航可以帮助用户快速定位到需要打开的文档,方便用户操作。以下是实现文件视图导航的步骤: 1. 在主框架窗口的资源文件中添加一个列表框控件,用于显示文件列表。 2. 在主框架窗口类的头文件中声明一个成员变量,用于存储当前打开的文档指针。 3. 在主框架窗口类的构造函数中,初始化文件列表框控件,并将其添加到主框架窗口中。 4. 在主框架窗口类中添加一个函数,用于更新文件列表框控件中的文件列表。该函数应该遍历当前打开的文档列表,将每个文档的文件名添加到文件列表框控件中。 5. 在主框架窗口类中添加一个消息处理函数,响应WM_CREATE消息。该消息处理函数应该调用更新文件列表框控件的函数,以便在主框架窗口创建时显示文件列表。 6. 在主框架窗口类中添加一个消息处理函数,响应WM_COMMAND消息。该消息处理函数应该判断用户是否选择了文件列表框控件中的一个文件,并根据选择的文件打开相应的文档。 7. 在文档类中添加一个成员变量,用于存储文档的文件名。 8. 在文档类中添加一个函数,用于更新文档的文件名,以便在文件列表框控件中显示正确的文件名。 9. 在文档类的构造函数中,将文档的文件名初始化为空字符串。 10. 在文档类的OnNewDocument函数中,更新文档的文件名。 11. 在文档类的OnOpenDocument函数中,更新文档的文件名,并调用主框架窗口类中的更新文件列表框控件的函数,以便在文件列表框控件中显示新打开的文档。 12. 在文档类的OnSaveDocument函数中,更新文档的文件名,并调用主框架窗口类中的更新文件列表框控件的函数,以便在文件列表框控件中显示保存后的文档。 13. 在文档类的OnCloseDocument函数中,更新文档的文件名,并调用主框架窗口类中的更新文件列表框控件的函数,以便在文件列表框控件中显示正确的文件列表。 通过以上步骤,就可以实现MFC文档应用程序中的文件视图导航功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值