VC项目开发之单文档多视图实现-非分割窗口[转]

k_eckel:http://www.mscenter.edu.cn/blog/k_eckel

多视图是VC开发中经常要用到的技术之一,一般地实现单文档多视图有两种方式

1)通过视图分割的技术(使用CSplitterWnd实现),将窗口分割为多个部分,每个部分显示各自显示不同的视图,这种技术实现起来比较简单,并且相关的资料也很多。

2)通过一个文档关联多个视图,窗口显示整个视图。

第二种实现较第一种复杂,这里给出详细的实现方法。

Step 1:使用VC 6.0新建一个Project,命名为:MultiView。除选择单文档属性外,一切使用“默认”方式。于是你可以获得五个类:CMainFrame ,CMultiViewAppCMultiViewDocCMultiViewView,和CAboutDlg

Step 2:新建一个新的视图View,添加一个新的MFC Class(Insert->New Class),基类为CView(或者CView的派生子类,如CEditView等)。类的名字为CAnotherView,这就是新的视图;并为CAnotherView添加GetDocument的实现:

CMultiViewDoc* CAnotherView::GetDocument()
{
       return (CMultiViewDoc*)m_pDocument;
}

Step 3:在CMultiViewApp添加成员变量记录这两个视图:

private:

       CView* m_pFirstView;

       CView* m_pAnotherView;

给程序菜单IDR_MAINFRAME添加一个菜单项目“视图”,该菜单项有两个子菜单“视图一”和“视图二”,添加相应函数(void CMultiViewApp:: OnShowFirstview()和void CMultiViewApp:: OnShowSecondview());

Step 4:创建新的视图:在BOOL CMultiViewApp::InitInstance()中添加代码:

…….

//创建一个新的视图
       CView* m_pActiveView = ((CFrameWnd*)m_pMainWnd)->GetActiveView();
       m_pFirstView = m_pActiveView;

       m_pAnotherView = new CAnotherView();

       //文档和视图关联
       CDocument* m_pDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();

       CCreateContext context;
       context.m_pCurrentDoc = m_pDoc;

       //创建视图
       UINT m_IDFORANOTHERVIEW = AFX_IDW_PANE_FIRST + 1;
       CRect rect;
       m_pAnotherView->Create(NULL,NULL,WS_CHILD,rect,m_pMainWnd,

m_IDFORANOTHERVIEW,&context);

    ……

Step 5:现在已经创建了视图,并且都和文档关联起来了。现在要作的就是视图间的转换。在void CMultiViewApp:: OnShowFirstview()中添加实现代码:

void CMultiViewApp::OnShowFirstview()
{
       // TODO: Add your command handler code here
       UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID);

    ::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));
    ::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);

       m_pAnotherView->ShowWindow(SW_HIDE);
       m_pFirstView->ShowWindow(SW_SHOW);

       ((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pFirstView);
       ((CFrameWnd*) m_pMainWnd)->RecalcLayout();

    m_pFirstView->Invalidate();

}

在void CMultiViewApp:: OnShowSecondview()中添加实现代码:

void CMultiViewApp::OnShowSecondview()
{

       // TODO: Add your command handler code here
       UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID);

    ::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));

    ::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);

       m_pFirstView->ShowWindow(SW_HIDE);

       m_pAnotherView->ShowWindow(SW_SHOW);     

       ((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pAnotherView);

       ((CFrameWnd*) m_pMainWnd)->RecalcLayout();

    m_pAnotherView->Invalidate();

}

Step 6:为了演示,这里将不同的视图给予一个标记,在CMultiViewViewCAnotherView的OnDraw方法中分别添加以下代码:

pDC->TextOut(400,300,"First View");

       pDC->TextOut(400,320,pDoc->GetTitle());

pDC->TextOut(400,300,"Another View");

       pDC->TextOut(400,320,pDoc->GetTitle());

至此就大功告成了,但是实现过程中有4点说明:

1) 实现中由于使用到相关的类,因此在必要的地方要include相关的头文件,这里省略;CAnotherView的默认构造函数是Protected的,需要将其改为Public,或者提供一个产生CAnotherView对象的方法(因要创建视图对象);

2) 这里给出的是一个示例代码,实际开发中可以通过参考实现获得自己想要实现的具体应用情况(例如视图类的不同、数量不同,更重要的还有业务逻辑的不同实现等);

3) 本文的示例代码已上传到Blog,可以通过下面的地址获得代码

转自:http://www.cppblog.com/Lee7/archive/2008/12/22/70036.html

VC项目开发之单文档多视图实现-非分割窗口[转],布布扣,bubuko.com

时间: 2024-10-08 10:21:24

VC项目开发之单文档多视图实现-非分割窗口[转]的相关文章

MFC单文档的视图分割

最近做的工作里包括了MFC单文档的分割,过程很简单,但还是想记录下来. 如下进行了单文档分割为三个视图的操作: 1 利用类向导建立额外的两个view  基类是CView 2 在mainFirm.cpp中包含两个新加的view的头文件 3 在mainFirm.h中添加分割窗口的成员变量CSplitterWnd m_wndSplitter; 4 在mainFirm.cpp中重写oncreateclient BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT

MFC单文档多视图程序设计与Splitter拆分窗口

1. 创建不同的子frame. 在文档视图程序中 CMainFrame(class CMainFrame : public CMDIFrameWndEx) 继承自 CMDIFrameWnd (CMDIFrameWndEx 为 CMDIFrameWnd子类). 因此可以将 m_pMainWnd 转为 CMDIFrameWnd 的指针, 再调用 CreateNewChild 创建一个子frame. 此时可根据传入的具体的类名, 强制转换为所需的对象. CMDIFrameWnd* pMdiFrmWnd

MFC文档、视图和框架

文档.视图.框架 文档/视图结构是MFC提供的一种不错的设计,它将数据的处理和显示分开来,这样更便于我们对程序的维护和扩展. 文档 文档对象用于管理和维护数据,包括保存数据.取出数据以及修改数据等操作,在数据被修改以后,文档可以通知其对应的所有视图更新显示. 文档类继承于CDocument类,主要成员函数: virtual BOOL OnNewDocument( ); 创建新文档.可以重载使用. virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);

VS2010-MFC(文档、视图和框架:概述)

转自:http://www.jizhuomi.com/software/221.html 前面几节讲了菜单.工具栏和状态栏的使用,本节开始将为大家讲解文档.视图和框架的知识. 文档.视图和框架简介 在VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)创建的单文档工程Example34中,我们可以看到MFC向导自动为我们生成了CExample34Doc类.CExample34View类和CMainFrame类,它们就分别是文档类.视图类和框架窗口类. 文档/视图结构是MFC提供

MFC:“Debug Assertion Failed!” ——自动生成的单文档程序项目编译运行就有错误

今天照着孙鑫老师的VC++教程学习文件的操作,VS2010,单文档应用程序,项目文件命名为File,也就有了自动生成的CFileDoc.CFileView等类,一进去就编译运行(就是最初自动生成的项目),编译通过,可运行时直接弹出错误框,有点小懵,,,啥都没做就给我看这个: 图一   错误提示框 后来搜索一查,网上好多类似的错误以及解决方案,几乎都试了个遍,有: 方法(1)-重新生成解决方案,或者将项目文件目录下Debug文件夹删了,重新生成Release版: 方法(2)-可以先声明一个临时的C

【VC编程技巧】窗体?3.5对单文档或者多文档程序制作启动画面

(一)概要: 文章描述了怎样通过Visual C++ 2012或者Visual C++ .NET,为单文档或者多文档程序制作启动画面.在Microsoft Visual Studio 6.0中对于单文档程序(SDI)我们可以很方便利用微软提供的组件Visual C++ Component (Splash Screen).因为在Microsoft Visual Studio 6.0以后的版本或者Visual C++ .NET没有提供这个组件,我们可以通过自定义对话框来实现Splash Screen

成都接单-网站/APP开发/价格实在/文档完备

接单-网站/APP开发/价格实在/文档完备优势:8年PHP 9年JAVA开发经验采用THINKPHP 和JFINAL ,SBadmin 2框架进行开发完善的开发文档免费一年BUG维护 可签协议,可先预付20%,也可分段付款, 亲 请带好需求文档! QQ 184377367 报价原则1:功能列表2:兼容性3:安全要求等级4:是否需要完善的开发文档5:后台UI是否有要求

用VC++MFC做文本编辑器(单文档模式)

用VC++MFC做文本编辑器(单文档模式) 原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下: < xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 1,首先新建一个工程,选择MFC AppWizard(exe),定名字为:textview_1,程序类型选择单个文档,其他均默

VC单文档对话框添加托盘图标

一 单文档添加托盘 1. 在CMainFrame中定义NOTIFYICONDATA结构m_notify 2.在OnCreate中添加托盘初始化代码 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; m_notify.cbSize = sizeof(NOTIFYICONDATA);//结构体大小 m_notify.hW