按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
份菜单是否一开始就有功效,必须视你选
用哪一种View 而定,例如CEditView
就内建有剪贴簿功能。
416
…………………………………………………………Page 479……………………………………………………………
第7章 簡單而完整:MFC 骨幹程式
标准MDI 程序应该具备的
【Window】菜单
【Help】菜单和About 对话框
亦已备妥。
此外,标准的工具栏和状态列也已备妥,并与菜单内容建立起映射关系。所谓工具栏,
是将某几个常用的菜单项目以按钮型式呈现出来,有一点热键的味道。这个工具栏可以
随处停驻(dockable )。所谓状态列,是主窗口最下方的文字显示区;只要菜单拉下,状
态列就会显示鼠标座落的菜单项目的说明文字。状态列右侧有三个小窗口(可扩充个
数),用来显示一些特殊按键的状态。
417
…………………………………………………………Page 480……………………………………………………………
第篇 湷觥 FC 程式設計
打印与预视功能也已是半成品。【File 】菜单拉下来可以看到【Print。。。 】和【Print Preview 】
两项目:
骨干程序的Document 和View 目前都还是白纸一张,需要我们加工,所以一开始看不
出打印与预视的真正功能。但如果我们在AppWizard 中选用的View 类别是CEditView
(如同第4章292 页),使用者就可以打印其编辑成果,并可以在打印之前预视。也就
是说,一进程序代码都不必写,我们就获得了一个可以同时编辑多份文件的文字编辑软件。
418
…………………………………………………………Page 481……………………………………………………………
第7章 簡單而完整:MFC 骨幹程式
Document/View 支撑你的应用程序
我已经多次强调,Document/View 是MFC 进化为Application Framework 的灵魂。这个特
征表现于程序设计技术上远多于表现在使用者接口上,因此使用者可能感觉不到什么是
Document/View 。程序员呢?程序员将因陌生而有一段阵痛期,然后开始享受它带来的便
利。
我们在OLE 中看到各对象(注)的集合称为一份Document ;在MDI 中看到子窗口所
掌握的资料称为一个Document ;现在在MFC 又看到Document 。〃Document〃 如今处处
可见,再过不多久八成也要和〃Object〃 一样地泛滥了。
OLE 对象指的是PaintBrush 完成的一张bitmap 、SoundRecorder 完成的一段Wave 声
音、Excel 完成的一份电子表格、Word 完成的一份文字等等等。为了恐怕与C++ 的「对象」
混淆,有些书籍将OLE object 称为OLE item 。
在MFC 之中,你可以把Document 简单想作是「资料」。是的,只是资料,那么MFC
的CDocument 简单地说就是负责处理资料的类别。
问题是,一个预先写好的类别怎么可能管理未知的资料呢?MFC 设计之际那些伟大的天
才们并不知道我们的数据结构,不是吗?! 他怎么知道我的程序要处理的资料是简单
如:
char name'20';
char address'30';
int age;
bool sex;
或是复杂如:
struct dbllistnode
{
struct dbllistnode *next; *prev;
struct info_t
{
int left;
int top;
419
…………………………………………………………Page 482……………………………………………………………
第篇 湷觥 FC 程式設計
int width;
int height;
void (*cursor)();
} *item;
};
的确,预先处理未知的资料根本是不可能的。CDocument 只是把空壳做好,等君入瓮。
它可以内嵌其它对象(用来处理基层数据类型如串行、数组等等),所以程序员可以在
Document 中拼拼凑凑出实际想要表达的文件完整格式。下一章进入Scribble 程序的实际
设计时,你就能够感受这一点。
CDocument 的另一价值在于它搭配了另一个重要的类别:CView。
不论什么型式,数据总是有体有面。实际的资料数值就是体,显示在屏幕上(甚而打印
机上)的画面就是面(图7…3a )。「数值的处理」应该使用字节、整数、浮点数、串
列、数组等数据结构,而「数值的表现」应该使用绘图工具如坐标系统、笔刷颜色、点
线圆弧、字形。。。。CView 就是为了资料的表现而设计的。
CMyDoc::Serialize(。。。)
CMyView::OnDraw(。。。)
{
{
// 把资料读出文件 // 取得Document,
// 放入Document 中 // 调用GDI 函数,
} // 将资料表现出来。
}
磁盘中的文件
The C++ piler gen
ings; all of which a
are caused by the ol
。。。
Hello; I am J。J。Hou;
a goodman。
。。。
The difference; omit
lpCmdLine parameter
。。。
图7…3a Document 是资料的体, View 是资料的面。
420
}
…………………………………………………………Page 483……………………………………………………………
第7章 簡單而完