`
Jack Wu
  • 浏览: 867632 次
  • 来自: ...
社区版块
存档分类
最新评论

C++--在单文档的应用程序增加多个视图

阅读更多

在mfc的单文档的应用程序(Application)设计时,一般是一种文档(Documnet)对应一种视图(View) 。然而在有些时候我需要一种文档用多种视图来展现,具体步骤如下:
我们有两个假设

  • CMyWinApp是该程序的应用程序,并声明和定义在MYWINAPP.H和MYWINAPP.CPP文件中.

  • CNewView是从CView上继承的视图类, 并声明和定义在NEWVIEW.H and NEWVIEW.CPP文件中.

    1.修改应用程序类(Application Class);
    在MYWINAPP.H加入如下声明
    CView* m_pOldView;
    CView* m_pNewView;
    CView* SwitchView( );
     m_pOldView 和m_pNewView分别指向当前的视图类(新建程序时自动创建的一个视图类)和即将创建的新的视图类,SwitchView函数用于相应用户视图切换操作,具体实现参见下面的步骤。
    在MYWINAPP.CPP文件中加入
    #include <AFXPRIV.H>

    2.创建和修改新的视图类 (View Class)
    选择菜单的“New Class”创建新的视图类,并将构造函数和析构函数的访问类型由protected改成public,这样用于动态创建视图。完成后保存文件。

    3.创建和绑定新视图(View)
    为了创建和绑定新视图,我们需要修改应用程序类的InitInstance函数,在ProcessShellCommand后面添加如下代码并保存:
    ...
    CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();
    m_pOldView = pActiveView;
    m_pNewView = (CView*) new CNewView;

    CDocument* pCurrentDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();

    // Initialize a CCreateContext to point to the active document.
    // With this context, the new view is added to the document
    // when the view is created in CView::OnCreate().
    CCreateContext newContext;
    newContext.m_pNewViewClass = NULL;
    newContext.m_pNewDocTemplate = NULL;
    newContext.m_pLastView = NULL;
    newContext.m_pCurrentFrame = NULL;
    newContext.m_pCurrentDoc = pCurrentDoc;

    // The ID of the initial active view is AFX_IDW_PANE_FIRST.
    // Incrementing this value by one for additional views works
    // in the standard document/view case but the technique cannot
    // be extended for the CSplitterWnd case.
    UINT viewID = AFX_IDW_PANE_FIRST + 1;
    CRect rect(0, 0, 0, 0); // Gets resized later.

    // Create the new view. In this example, the view persists for
    // the life of the application. The application automatically
    // deletes the view when the application is closed.
    m_pNewView->Create(NULL, "AnyWindowName", WS_CHILD, rect, m_pMainWnd, viewID, &newContext);

    // When a document template creates a view, the WM_INITIALUPDATE
    // message is sent automatically. However, this code must
    // explicitly send the message, as follows.
    m_pNewView->SendMessage(WM_INITIALUPDATE, 0, 0);
    ...

    4.实现切换功能函数(Switching Function)
    MYWINAPP.CPP文件中添加如下代码,并保存。
    CView* CMyWinApp::SwitchView( )
    {
       CView* pActiveView =  ((CFrameWnd*) m_pMainWnd)->GetActiveView();

       CView* pNewView= NULL;
       if(pActiveView == m_pOldView)
          pNewView= m_pNewView;
       else
          pNewView= m_pOldView;

       // Exchange view window IDs so RecalcLayout() works.
       #ifndef _WIN32
       UINT temp = ::GetWindowWord(pActiveView->m_hWnd, GWW_ID);
       ::SetWindowWord(pActiveView->m_hWnd, GWW_ID, ::GetWindowWord(pNewView->m_hWnd, GWW_ID));
       ::SetWindowWord(pNewView->m_hWnd, GWW_ID, temp);
       #else
       UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);
       ::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID));
       ::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);
       #endif
       pActiveView->ShowWindow(SW_HIDE);
       pNewView->ShowWindow(SW_SHOW);
       ((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView);
       ((CFrameWnd*) m_pMainWnd)->RecalcLayout();
       pNewView->Invalidate();
       return pActiveView;
    }

    5.调用SwitchView函数的实现
    调用SwitchView函数可以通过增加菜单项来是实现。
    void CMainFrame::OnForm1()
    {
    SwitchView();
    }
    URL:http://msdn2.microsoft.com/en-us/library/s199bks0(VS.80).aspx

  • 分享到:
    评论

    相关推荐

      mfc单文档多视图

      一个简便的mfc单文档多视图demo,共享给大家

      实验1 构造应用程序框架.zip

      建出一个单文档应用程序,能在视图窗口中输出"Hello,Welcome to Visual C++ 6.0!";创建出一个多文档文档应用程序,能在视图窗口中输出"Hello,Welcome to Visual C++ 6.0!";创建出一个基于对话框的应用,能在...

      VISUAL C++MFC编程实例

      8.6 例37 动态分割一个视图 163 第9章 对话框和对话条 166 9.1 例38 使用对话框编辑器 166 9.2 例39 创建一个对话框类 168 9.3 例40 模式对话框 170 9.4 例41 无模式对话框 171 9.5 例42 在无模式对话框的控件间 ...

      C++MFC教程

      5、在对多文档要求不强烈时尽量避免多文档视结构,可以利用分隔条产生单文档多视结构。 6、在要求在多个文档间传递数据时使用多文档视结构。 7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功能的目的...

      VC++ 6.0多文档界面全屏显示代码源程序

      VC++ 6.0多文档界面全屏显示代码源程序 .cpp 一个完整的工程

      MFC文档视图程序(VC++源码)

      摘要:VC/C++源码,界面编程,MFC,文档视图 MFC文档视图程序    1 MFC文档视图的各个部分    1.1 CWinApp 应用程序类,应用程序的  启动/消息处理等。类中还维护了  一个文档管理器。  1.2 CFrameWnd 框架窗口...

      Visual C++ 2005入门经典--源代码及课后练习答案

      1.3 编写C++应用程序 3 1.4 学习Windows编程 4 1.4.1 学习C++ 4 1.4.2 C++标准 5 1.4.3 控制台应用程序 5 1.4.4 Windows编程概念 6 1.5 集成开发环境简介 7 1.6 使用IDE 9 1.6.1 工具栏选项 9 ...

      Visual C++ 2005程序设计(pdf版)-4

      本书详细描述了使用Visual C++2005与MFC开发Windows窗体应用程序的方法,通过循序渐进的教学模式,一步步教读者构建功能复杂的Win32应用程序。. 全书共19章,前3章简单回顾了C+十语言的重点并介绍MFC库中与...

      Visual C++ 2005程序设计(pdf版)-5

      本书详细描述了使用Visual C++2005与MFC开发Windows窗体应用程序的方法,通过循序渐进的教学模式,一步步教读者构建功能复杂的Win32应用程序。. 全书共19章,前3章简单回顾了C+十语言的重点并介绍MFC库中与...

      Visual C++ 2005程序设计(pdf版)-6

      本书详细描述了使用Visual C++2005与MFC开发Windows窗体应用程序的方法,通过循序渐进的教学模式,一步步教读者构建功能复杂的Win32应用程序。. 全书共19章,前3章简单回顾了C+十语言的重点并介绍MFC库中与...

      Visual C++ 2005程序设计(pdf版)-3

      本书详细描述了使用Visual C++2005与MFC开发Windows窗体应用程序的方法,通过循序渐进的教学模式,一步步教读者构建功能复杂的Win32应用程序。. 全书共19章,前3章简单回顾了C+十语言的重点并介绍MFC库中与...

      Visual C++ 2005程序设计(pdf版)-8

      本书详细描述了使用Visual C++2005与MFC开发Windows窗体应用程序的方法,通过循序渐进的教学模式,一步步教读者构建功能复杂的Win32应用程序。. 全书共19章,前3章简单回顾了C+十语言的重点并介绍MFC库中与...

      Visual C++实践与提高-COM和COM+篇『PDF』

      8.3.6 绘制多个嵌入对象 8.3.7 实现嵌入对象的删除 8.3.8 创建并测试Container程序 8.4 ActiveX文档——例程ScribbleActiveX 8.4.1 比较ActiveX文档与OLE文档(用户角度) 8.4.2 比较ActiveX文档与OLE文档(开发者...

      Visual C++ 6.0完全自学

      calculator 第一个用Visual C++ 6.0开发的Windows应用程序(简易计算器)。 第8章(\8-Games) 示例描述:介绍如何编写基于文档/视图结构的Windows应用程序。 Eight 基于文档/视图结构的八数码游戏。 第9章...

      Visual C++ 2005程序设计(pdf版) - 2

      本书详细描述了使用Visual C++2005与MFC开发Windows窗体应用程序的方法,通过循序渐进的教学模式,一步步教读者构建功能复杂的Win32应用程序。. 全书共19章,前3章简单回顾了C+十语言的重点并介绍MFC库中与...

      Visual C++ 2005程序设计(pdf版)-7

      本书详细描述了使用Visual C++2005与MFC开发Windows窗体应用程序的方法,通过循序渐进的教学模式,一步步教读者构建功能复杂的Win32应用程序。. 全书共19章,前3章简单回顾了C+十语言的重点并介绍MFC库中与...

      VC开发经典模式与实例.rar

      然后介绍了现代软件工程的基本思想,使读者能够在一个比较高的层面上对Visual C++编程与软件开发有一个较为全面的认识;从第3章开始,结合开发实例,根据现代软件工程的相关理论与方法,详细分析了Visual C++在各种...

      Visual C++编程技巧精选集 光盘

      108.如何在单文档程序主菜单中增加菜单 109.如何启用和禁用主菜单组中的子菜单 110.如何删除单文档程序的主菜单 111.如何根据数据库记录动态创建菜单 112.如何取消无消息响应菜单的状态限制 113.如何显示或隐藏菜单...

      MFC Windows程序设计(第2版修订版)--源代码

      本书从让您亲自手写代码开始(不用向导),使用MFCl.0的应用程序结构风格,也就是说,既不用文档也不用视图。只有在您掌:握了上述的基础知识,初步认识了简单的MFC类库如CWnd和CWinApp之后,我才开始介;绍向导并教...

    Global site tag (gtag.js) - Google Analytics