- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单文档与多视的实现方法
单文档与多视的实现方法一、单文档与多视 Windows程序一般分为以下几种风格:多文档、单文档、基于对话框的。 Word一类多文档程序和计算器一类基于对话框的程序不在本文介绍之列。单文 档又分为单视的和多视的。一般情况下,单文档仅需要单视就够了,如画笔等。 但也有一些情况下,单文档需要多视支持,比如同时观察文档的不同部分,同时 从不同的角度观察同一文档等。 在MFC的框架下,文档对象(CDocument)维持了一个保存其所有视的列表, 并提供了增加与删除视的函数,以及当文档内容改变时通知其所有视的方法。 通过多文档框架的窗口复制机制和单文档框架的分割窗口机制是实现单文档多 视的主要方法。但这些标准方法在有的情况下并不够用,为此笔者摸索出另 外两种实用的方法,在实践中使用效果良好。 二、三种标准的单文档与多视情况 1.视对象基于同一视类,每个视位于MDI的一个独立子文档框架中。 用户可以通过“窗口\新窗口”菜单,为同一文档的视再创建一个窗口,通过 新创建的窗口,可以编辑和观察文档的另一部分,同一文档各个视图之间自动实 现同步,用户修改一个视的内容,在另外的视中也自动更新。 MFC框架通过复制原来的子框架窗口和其中的视来实现上面的功能,并且是 完全自动的。 2.视对象基于同一视类,所有视位于同一文档框架中。 分割窗口将单文档窗口的视区分割成几个独立的视,框架从同一视类创建多 个视对象。Word的子窗口即属于这种类型。 3.视对象基于不同的视类,所有的视位于同一文档框架中。 多个视共享同一文档框架,但从不同的视类创建,每个视可以为文档提供不 同的观察和编辑方法。比如一个视用图形观察文档,而另一个视用文本编辑文档 中对象的属性。这种情况也适应于用不同的视来观察文档的不同部分。这种类 型的实现方法是通过重载OnCreateClient函数实现。下面的例子实现了图中的分 割窗口。 BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT,CCreateContext* pContext) { RECT rect; // 先分割为 1X2的形式 m_wndSplitter1.CreateStatic(this, 1, 2, WS_CHILD | WS_VISIBLE ); m_wndSplitter1.SetColumnInfo(0,300,0); // 设置第一列的宽度 // 将第一列进一步分割为 2X1的形式 m_wndSplitter2.CreateStatic( m_wndSplitter1,2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0, 0)); // 创建各个视 m_wndSplitter1.CreateView(0, 1, RUNTIME_CLASS(CviewView1), CSize(0, 0), pContext); m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CviewView2), CSize(0, 0), pContext); m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CviewView3), CSize(0, 0), pContext); ...... } 在实践中,笔者发现这三种方式有时都不适用。比如以下的两种情况:需 要在不同的时间分别观察同一文档的不同部分,而文档分割成不同部分的数量较 多,这样就不宜用分割窗口来实现,而需要在同一框架中切换不同的视;另一种 情况可以说是上面提到的第三种情况和此处第一种情况的组合,即在单文档框 架中包含有多个由分割窗口分割的区域,而某(或某些)分割区域中包含有多个 不同的视,仅有其中的一个视显示出来。与第三种情况类似,其它分割区域中具 有不同的视,但它们同时显示出来。因为在实现方法上有所不同,所以这里分为 两种情况来讨论,这也是这篇文章要介绍的重点。 三、单文档单框架窗口中的多视 下面的例子演示了第一种情况下,具有两个视的简单实现方法。必需考虑如 下的问题:非活动的视是否继续连接到文档。当视连接到文档时,它从文档接收 OnUpdate通知消息,使其保持与文档内容同步。但这样做将增加计算机的开销, 同时也会增
文档评论(0)