按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
MFC 所谓的Document 观念。此外,「MDI 风格」还包括程序必须有一个Window 选
单,提供对于小子窗口的管理,包括tile 、cascade、icon arrange 等命令项:
701
…………………………………………………………Page 764……………………………………………………………
第篇 深入 MFC 程式設計
至于SDI 程序,就是一般的、没有上述风格的non…MDI 程序。
在MFC 的定义中,MDI 表示可「同时」开启一份以上的Documents ,这些Documents
可以是相同类型,也可以是不同类型。许多份Documents 同时存在,必然需要许多个子
窗口容纳之,每个子窗口其实是Document 的一个View 。即使你在MDI 程序中只开启
一份Document ,但以【Window/New Window 】的方式打开第二个view 、第三个view。。。 ,
亦需占用多个子窗口。因此这和SDK 所定义的MDI 有异曲同工的意义。
至于SDI 程序,同一时间只能开启一份Document 。一份Document 只占用一个子窗口
(亦即其View 窗口),因此这也与SDK 所定义的SDI 意义相同。当你要在SDI 程
式中开启第二份Document ,必须先把第一份Document 关闭。
MDI 程序未必一定得提供一个以上的Document 类型。所谓不同的Document 类型是指
程序提供不同的CDocument 衍生类别,亦即有不同的Document Template。软件工业早
期曾经流行一种「全效型」软件,既处理电子表格、又作文书处理、又能绘图作画! K ,伟
大得不得了,这种软件就需要数种文件类型:电子表格、文书、图形! K 。
702
…………………………………………………………Page 765……………………………………………………………
第 13 章 多重文件與多重顯示
多重显像 ( )
Multiple Views
只要是具备MDI 性质的MFC 程序(也就是你曾在AppWizard 步骤一中选择【Multiple
Documents 】项目),天生就具备了「多重显像」能力。「天生」的意思是你不必动手,
application framework 已经内含了这项功能:随便执行任何一版的Scribble,你都可以在
【Window 】菜单中找到【New Window 】这个命令项,按下它,就可以获得「同源子视
窗」如图13…1。
我将以「多重显像」来称呼Multiple Views 。多重显像的意思是资料可以不同的类型显现
出来。并以「同源子窗口」代表「显示同一份Document 而又各自分离的View 窗口」。
图13…1 【Window/New Window】可以为 「目前作用中的View 所对应的
Document 再开一个View 窗口。
703
…………………………………………………………Page 766……………………………………………………………
第篇 深入 MFC 程式設計
另外,第11 章也介绍了一种变化,是利用分裂窗口的各个窗口,显示Document 内容。
这些窗口虽然集中在一个大窗口中,但它们的视野却可以各自独立,也就是说它们可以
看到Document 中的不同区域,如图13…2。
图13…2 分裂窗口的不同窗口可以观察同一Document 资料的不同区域。
但是我们发现,不论是同源子窗口或分裂窗口的窗口,都是以相同的方式(也就是同一
个CMyView::OnDraw )表现Document 内容。如果我们希望表达力丰富一些,如何是好?
到现在为止我们并没有看到任何一个Scribble 版本具备了多种显像能力。
窗口的动态分裂
动态分裂窗口由CSplitterWnd 提供服务。这项技术已经在第11 章的Scribble Step4 示范
过了。它并没有多重显像的能力,因为每一个窗口所使用的View 类别完全相同。当第
704
…………………………………………………………Page 767……………………………………………………………
第 13 章 多重文件與多重顯示
一个窗口形成(也就是分裂窗口初产生的时候),它将使用Document Template 中登记
的View 类别,作为其View 类别。尔后当分裂发生,也就是当使用者拖拉滚动条之上名
为分裂棒(splitter box)的横杆,导至新窗口诞生,程序就以「动态生成」的方式产生出
新的View 窗口。
因此,View 类别一定必须支持动态生成,也就是必须使用DECLARE_DYNCREATE 和
IMPLEMENT_DYNCREATE 宏。请回顾第8章。
AppWizard 支持动态分裂窗口。当你在AppWizard 步骤四的【Advanced 】对话框的
【Windows Styles 】附页中选按【Use split window 】选项:
你的程序比起一般未选【Use split window 】选项者有如下差异(阴影部份):
705
…………………………………………………………Page 768……………………………………………………………
第篇 深入 MFC 程式設計
// in CHILDFRM。H
class CChildFrame : public CMDIChildWnd
{
。。。
protected:
CSplitterWnd m_wndSplitter;
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CChildFrame)
public:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs; CCreateContext* pContext);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
。。。
};
// in CHILDFRM。CPP
BOOL CChildFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/;
CCreateContext* pContext)
{
return m_wndSplitter。Create( this;
2; 2; // TODO: adjust the number of rows; columns
CSize( 10; 10 ); // TODO: adjust the minimum pane size
pContext );
}
◆ CSplitterWnd::Create 的详细规格请回顾第11 章。
这些其实也就是我们在第11 章为Scribble Step4 亲手加上的码。如果你一开始就打定主
意要使用动态分裂窗口,如上便是了。
窗口(Panes )之间的