VC5.0中单文档与多视的实现方法

上传人:洪易 文档编号:39983579 上传时间:2018-05-21 格式:DOCX 页数:7 大小:23.97KB
返回 下载 相关 举报
VC5.0中单文档与多视的实现方法_第1页
第1页 / 共7页
VC5.0中单文档与多视的实现方法_第2页
第2页 / 共7页
VC5.0中单文档与多视的实现方法_第3页
第3页 / 共7页
VC5.0中单文档与多视的实现方法_第4页
第4页 / 共7页
VC5.0中单文档与多视的实现方法_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《VC5.0中单文档与多视的实现方法》由会员分享,可在线阅读,更多相关《VC5.0中单文档与多视的实现方法(7页珍藏版)》请在金锄头文库上搜索。

1、VC5.0 中单文档与多视的实现方法一、单文档与多视Windows 程序一般分为以下几种风格:多文档、单文档、基于对话框的。 Word 一类多文档程序和计算器一类基于对话框的程序不在本文介绍之列。单文 档又分为单视的和多视的。一般情况下,单文档仅需要单视就够了,如画笔等。但也有一些情况下,单文档需要多视支持,比如同时观察文档的不同部分,同 时 从不同的角度观察同一文档等。在 MFC 的框架下,文档对象(CDocument)维持了一个保存其所有视的列表, 并提供了增加与删除视的函数,以及当文档内容改变时通知其所有视的方法。 通过多文档框架的窗口复制机制和单文档框架的分割窗口机制是实现单文档多 视

2、的主要方法。但这些标准方法在有的情况下并不够用,为此笔者摸索出另 外两种实用的方法,在实践中使用效果良好。二、三种标准的单文档与多视情况1视对象基于同一视类,每个视位于 MDI 的一个独立子文档框架中。用户可以通过“窗口新窗口”菜单,为同一文档的视再创建一个窗口,通 过 新创建的窗口,可以编辑和观察文档的另一部分,同一文档各个视图之间自动 实 现同步,用户修改一个视的内容,在另外的视中也自动更新。MFC 框架通过复制原来的子框架窗口和其中的视来实现上面的功能,并且 是 完全自动的。2视对象基于同一视类,所有视位于同一文档框架中。分割窗口将单文档窗口的视区分割成几个独立的视,框架从同一视类创建

3、多 个视对象。Word 的子窗口即属于这种类型。3视对象基于不同的视类,所有的视位于同一文档框架中。多个视共享同一文档框架,但从不同的视类创建,每个视可以为文档提供 不 同的观察和编辑方法。比如一个视用图形观察文档,而另一个视用文本编辑文 档 中对象的属性。这种情况也适应于用不同的视来观察文档的不同部分。这种类 型的实现方法是通过重载 OnCreateClient 函数实现。下面的例子实现了图中的 分 割窗口。BOOL CMainFrame:OnCreateClient( LPCREATESTRUCT,CCreateContext* pContext)RECT rect;/ 先分割为 1X2

4、的形式m_wndSplitter1.CreateStatic(this, 1, 2, WS_CHILD | WS_VISIBLE );m_wndSplitter1.SetColumnInfo(0,300,0); / 设置第一列的宽度/ 将第一列进一步分割为 2X1 的形式m_wndSplitter2.CreateStatic( / 创建各个视m_wndSplitter1.CreateView(0, 1,RUNTIME_CLASS(CviewView1), CSize(0, 0), pContext);m_wndSplitter2.CreateView(0, 0,RUNTIME_CLASS(Cv

5、iewView2), CSize(0, 0), pContext);m_wndSplitter2.CreateView(1, 0,RUNTIME_CLASS(CviewView3), CSize(0, 0), pContext);.在实践中,笔者发现这三种方式有时都不适用。比如以下的两种情况:需 要在不同的时间分别观察同一文档的不同部分,而文档分割成不同部分的数量 较 多,这样就不宜用分割窗口来实现,而需要在同一框架中切换不同的视;另一 种 情况可以说是上面提到的第三种情况和此处第一种情况的组合,即在单文档框 架中包含有多个由分割窗口分割的区域,而某(或某些)分割区域中包含有多 个 不同的视,

6、仅有其中的一个视显示出来。与第三种情况类似,其它分割区域中 具 有不同的视,但它们同时显示出来。因为在实现方法上有所不同,所以这里分 为 两种情况来讨论,这也是这篇文章要介绍的重点。三、单文档单框架窗口中的多视下面的例子演示了第一种情况下,具有两个视的简单实现方法。必需考虑 如 下的问题:非活动的视是否继续连接到文档。当视连接到文档时,它从文档接 收 OnUpdate 通知消息,使其保持与文档内容同步。但这样做将增加计算机的开销,同时也会增加程序开发的任务。另一方法是当非活动的视重新变成活动时,再 进 行与文档的同步工作。例子中采用后一种方法。BOOL CMainFrame:OnViewCha

7、nge(UINT nCmdID)CView* pViewAdd;CView* pViewRemove;CDocument* pDoc = GetActiveDocument();UINT nCmdID;nCmdID = LOWORD(GetCurrentMessage()-wParam);if(nCmdID = ID_VIEW_VIEW1) if(nCmdID = ID_VIEW_VIEW2) if (nCmdID = ID_VIEW_VIEW2)if (m_pView2 = NULL)m_pView1 = GetActiveView();m_pView2 = new CMyView2;m_p

8、View2-Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,rectDefault, this, AFX_IDW_PANE_FIRST + 1, NULL);pViewAdd = m_pView2;pViewRemove = m_pView1;m_currentView= 2;elsepViewAdd = m_pView1;pViewRemove = m_pView2;m_currentView= 1;/ 将活动视的 child id 设置为 AFX_IDW_PANE_FIRST/ 将其它视设置为 AFX_IDW_PANE_FIRST 以外的值,/ 这样当调用 C

9、FrameWnd:RecalcLayout 重新布局窗口时,/ 才会得到正确的视int nSwitchChildID = pViewAdd-GetDlgCtrlID();pViewAdd-SetDlgCtrlID(AFX_IDW_PANE_FIRST);pViewRemove-SetDlgCtrlID(nSwitchChildID);/ 显示活动视而隐藏非活动视pViewAdd-ShowWindow(SW_SHOW);pViewRemove-ShowWindow(SW_HIDE);/ 将新的活动视连接到文档,并断开原来的视与文档的连接pDoc-AddView(pViewAdd);pDoc-Re

10、moveView(pViewRemove);SetActiveView(pViewAdd);RecalcLayout();四、单文档分割窗口中,某分割区的多视的实现第二种情况下,窗口的分割与标准方法的第 3 种类似,这里不再重复。下 面 的函数用于切换某分割(第 3 种标准界面中,左上区域)区域中的视。这里的实现方法是:先删除原来的视,然后在原分割区域创建一个新的视。void CMainFrame:OnViewView1() ChangeView(RUNTIME_CLASS(CviewView1);ViewingView = ID_VIEW_VIEW1;void CMainFrame:OnVi

11、ewView2() ChangeView(RUNTIME_CLASS(CviewView2);ViewingView = ID_VIEW_VIEW2;void CMainFrame:OnUpdateViewView1(CCmdUI* pCmdUI) pCmdUI-SetCheck(ViewingView = ID_VIEW_VIEW1);void CMainFrame:OnUpdateViewView2(CCmdUI* pCmdUI) pCmdUI-SetCheck(ViewingView = ID_VIEW_VIEW2);void CMainFrame:ChangeView(CRuntime

12、Class * pRTClass)/ 先删除原来的视m_wndSplitter2.DeleteView(0,0);/ 创建新的视CCreateContext Context;Context.m_pNewViewClass = pRTClass; / 视类Context.m_pCurrentDoc = GetActiveDocument(); / 与文档连接m_wndSplitter2.CreateView(0,0, pRTClass,CSize(0,0),CView * pView = (CView *)m_wndSplitter2.GetPane(0,0); / 获取分割 区域pView-ShowWindow(SW_SHOW);pView-OnInitialUpdate(); SetActiveView(pView);m_wndSplitter2.SetRowInfo(0, 300, 20); / 设置宽度:SetWindowLong(pView-m_hWnd, GWL_ID, AFX_IDW_PANE_FIRST);m_wndSplitter2.RecalcLayout();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号