按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
}
}
//如果我们不能解释hint 内容(也就是说它不是我们所预期的
638
…………………………………………………………Page 701……………………………………………………………
第 11 章 View 功能之加強與重繪效率之提昇
对象),那就让整个窗口重绘吧(把整个窗口设为无效区)。
// CStroke
Invalidate(TRUE);
return;
}
为什么OnUpdate 之中要调用OnPrepareDC?这关系到滚动条,我将在介绍分裂窗口时再
说明。另,GetBoundingRect 动作如下:
CRect& GetBoundingRect() { return m_rectBounding; }
OnDraw 函数也为了高效能重绘动作之故,做了以下修改。阴影部份是与Scribble Step3
不同之处:
// SCRIBVW。CPP
void CScribbleView::OnDraw(CDC* pDC)
{
CScribbleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 取得窗口的无效区。如果是在打印状态情况下,则取
// printer DC 的截割区(clipping region)。
CRect rectClip;
CRect rectStroke;
pDC…》GetClipBox(&rectClip);
//
// 注意:CScrollView::OnPrepare 已经在OnDraw 被调用之前先一步
// 调整了DC 原点,用以反应出目前的卷动位置。关于CScrollView,
// 下一节就会提到。
//调用CStroke::DrawStroke 完成无效区中各线条的绘图动作
CTypedPtrList& strokeList = pDoc…》m_strokeList;
POSITION pos = strokeList。GetHeadPosition();
while (pos != NULL)
{
CStroke* pStroke = strokeList。GetNext(pos);
rectStroke = pStroke…》GetBoundingRect();
if (!rectStroke。IntersectRect(&rectStroke; &rectClip))
continue;
pStroke…》DrawStroke(pDC);
}
}
639
…………………………………………………………Page 702……………………………………………………………
第篇 深入 MFC 程式設計
可卷动的窗口:CScrollView
到目前为止我们还没有办法观察一张比窗口还大的图,因为我们没有滚动条。
一个View 窗口没有滚动条,是很糟糕的事,因为通常Document 范围大而观景窗范围小。
我们不能老让Document 与View 窗口一样大。一个具备滚动条的View 窗口更具有「观
景窗」的意义。
Document
電腦資訊 ,是個洠в袀惱淼念I域 。「洠в袀惱怼沟囊馑迹褪谴蠹译S時可能歸零 ,任何永
IQ EQ
遠有機會爬到任何的頭。而切的成功,不是靠 ,是靠 。
View1
EQ 這個字眼最近引起大颍齽印N沂窃诖蠹s兩個月前與位讀友見面,從他口第次聽到的。
這位朋友是 ENT 執業醫師(ENT 者,ear/nose/throat 是也),他在專業以外的第素養,以及
追求新知的熱情,著實讓我感動。對於醫界沉痾的剴切直言,更讓執筆無責任書評的我,有吾
道不孤之感,呵呵。會拿起封了八個月的筆,與這位讀友的席談實有許多關係。
◆根魚刺 View2
葉醫師,我的這位讀友,對我提到最近的本奇特小書:資訊游俠列傳、無責任書評2、我的
電腦探索,並以種不勝幽然的口吻說:「看到這些年紀輕輕的小輩們頭角崢嶸,自己學個
Visual Basic 。。。
卻心力支絀,實在有莫大的打擊 」。侯捷是這本書的唯交集,本應遵循
「瓜田不迹模畈徽凇怪庞枺欢乙嘤懈~刺鯁在我的喉結裡。
這本書裡頭,資訊游俠列傳是個男對九個男的探索(別铡畷耍皇乔樯膶W);無
責任書評2是個「讀書懷獨行君子之節」的的技術評論與文關懷,非常私,十分另
類。我的電腦探索則是十個男對電腦資訊的深情告白。如果以結婚為分水嶺,劃分男與男
孩,那麼第本書其實是「個男與九個男孩」對電腦的深情告白。
。。。
图11…5a 一个具备滚动条的View 窗口更具 「观景窗」的意义
如果你有SDK 程序设计经验,你就会知道设计一个可卷动的窗口是多么烦琐的事(文
字的卷动还算好,图形的卷动更惨)。MFC 当然不可能对此一般性功能坐视不管,事实
上它已设计好一个CScrollView,其中的滚动条有实时卷动(边拉卷动杆边跑)的效果。
基本上要使View 窗口具备滚动条,你必须做到下列事情:
640
…………………………………………………………Page 703……………………………………………………………
第 11 章 View 功能之加強與重繪效率之提昇
Document
200
450
270
垂
目前垂直位置= 200
直
300 滚
目前水平位置 =270 动
条
水平頁大小= 450 范
900 围
900
水平滚动条范围 = 800
垂
直
頁
大
小
300
800
图11…5b 滚动条View 窗口与Document 之间的关系
定义Document 大小。如果没有大小,Framework 就没有办法计算滚动条尺寸,
以及卷动比例。这个大小可以是常数,也可以是个储存在每一Document 中的
变量,随着执行时期变动。
以CScrollView 取代CView。
只要Document 的大小改变,就将尺寸传给CScrollView 的SetScrollSizes 函
式。如果程序设定Document 为固定大小(本例就是如此),那么当然只要一
开始做一次滚动条设定