zoukankan      html  css  js  c++  java
  • mfc中MDI模式下实现单文档多视图多窗口

    mfc在mdi模式下可以很方便的实现多文档多视图,但是如何实现单文档多视图呢?例如对于一堆数据,我们既想以文本的方式显示,同时也想支持表格或者图形的展示方式,这就是单文档多视图的主要应用场景。参考侯俊杰的《深入浅出mfc》,主要的实现思路总结如下。

    1、编写视图类
    编写继承自CView的MyView,类型个数没有限制,例如可以添加一个图形的MyDrawView,一个图表的MyTableView。

    2、注册视图模板
    在当前程序唯一对象类(继承自CWinApp)的InitInstance函数添加如下代码:
    m_newDocTemp = new CMultiDocTemplate(IDR_MYTYPE,
    RUNTIME_CLASS(CMyDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CMyView));

    通常可以写在默认的AddDocTemplate(pDocTemplate)的后面,注意m_newDocTemp 不要调用AddDocTemplate,后面我们会手动调用相应的文档模板。CMyView就是在第1步中编写的视图类。

    3、打开视图
    参考《深入浅出mfc》541页的说明,mfc在内部实现了OnWindowNew函数,所以我们可以打开mfc的源码,找到OnWindowNew的实现,然后拷贝到我们自己的打开函数中。

    CMDIChildWnd *pActiveChild = MDIGetActive();
    CDocument *pDocument;
    if (pActiveChild == NULL ||
    (pDocument = pActiveChild->GetActiveDocument()) == NULL)
    {
    TRACE(traceAppMsg, 0, "Warning: No active document for WindowNew command. ");
    AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
    return nullptr; // command failed
    }

    // otherwise we have a new frame !
    //CDocTemplate *pTemplate = pDocument->GetDocTemplate();
    CDocTemplate *pTemplate = dynamic_cast<CMyCApp *>(AfxGetApp())->m_myDocTemp;
    ASSERT_VALID(pTemplate);
    CFrameWnd *pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
    if (pFrame == NULL)
    {
    TRACE(traceAppMsg, 0, "Warning: failed to create new frame. ");
    return nullptr; // command failed
    }

    pTemplate->InitialUpdateFrame(pFrame, pDocument);

    其中的m_myDocTemp就是我们在第一步声明的。

    4、如何定义多视图窗口标签的标题
    在CChildFrame::PreCreateWindow函数中添加如下语句
    cs.style &= ~(LONG)FWS_ADDTOTlTLE;
    然后第3步创建完视图之后,可以通过 pFrame->SetWindowText(name.c_str())设置窗口标题

    5、如何遍历多视图
    POSITION pos = tabGroups.GetHeadPosition();
    while (pos)
    {
    CMFCTabCtrl *pTabCtrl = (CMFCTabCtrl*)tabGroups.GetNext(pos);
    for (int i = 0; i < pTabCtrl->GetTabsNum(); i++)
    {
    CMDIChildWndEx *pChildWnd = dynamic_cast <CMDIChildWndEx *>(pTabCtrl->GetTabWnd(i));
    }
    }

  • 相关阅读:
    hotel管理
    MySQL数据库的学习
    搭建纸飞机
    二维码
    Linux 的安装
    AngularJS学习笔记
    css3部分知识点
    如何处理数据
    jq跨域在127.0.0.1:8020上的写法
    AJAX请求方式
  • 原文地址:https://www.cnblogs.com/ljy339/p/12722513.html
Copyright © 2011-2022 走看看