按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
RUNTIME_CLASS(CScribbleView));
俱往矣!Visual C++ 4。0 之后的AppWizard 为Scribble 产生的类别是这个样子:
用途 类别名称 基础类别
main frame CMainFrame CMDIFrame Wnd
document frame CChildFrame CMDIChild Wnd
view CScribble View CView
document CScribbleDoc CDocument
而其CMultiDocTemplate 对象是这样子的:
pDocTemplate = new CMultiDocTemplate(
IDR_SCRIBTYPE;
RUNTIME_CLASS(CScribbleDoc);
RUNTIME_CLASS(CChildFrame);
RUNTIME_CLASS(CScribbleView));
这就方便多了, CChildFrame 相当于以前( MFC 4。0 之前) 你得自力完成的
CScribbleFrame。现在,我们可以从「为此类别新添成员变量」开始作为。
654
…………………………………………………………Page 717……………………………………………………………
第 11 章 View 功能之加強與重繪效率之提昇
以下是加上分裂窗口的步骤:
在ClassView (注意,不是ClassWizard )中选择CChildFrame。按下右键,选
择突冒式菜单中的【Add Variable 】
出现【Add Member Variable 】对话框。填充如下,然后选按【OK 】。
现在你可以从ClassView 画面中实时看到CChildFrame 的新变量。
打开ChildFrm。cpp,在WizardBar 的【Messages 】清单中选择OnCreateClient。
以Yes 回答WizardBar 的询问,产生处理例程。
在函数空壳中键入以下内容:
return m_wndSplitter。Create(this; 2; 2; CSize(10; 10); pContext);
655
…………………………………………………………Page 718……………………………………………………………
第篇 深入 MFC 程式設計
回到ClassView 之中,你可以看到新的函数。
CSplitterWnd::Create 正是产生分裂窗口的关键,它有七个参数:
1。 表示父窗口。这里的this 代表的是CChildFrame 窗口。
2。 分裂窗口的水平窗口数(row )
3。 分裂窗口的垂直窗口数(column )
4。 窗口的最小尺寸(应该是一个CSize 对象)
5。 在窗口上使用哪一个View 类别。此参数直接取用Framework 交给
OnCreateClient 的第二个参数即可。
6。 指定分裂窗口的风格。默认值是: WS_CHILD|WS_ VISIBLE|WS_HSCROLL |
WS_ VSCROLL|SPLS_DYNAMIC_SPLIT ,意思就是一个可见的子窗口,有着水平卷
轴和垂直滚动条,并支持动态分裂。关于动态分裂(以及所谓的静态分裂),第
13 章将另有说明。
7。 分裂窗口的ID 。默认值是AFX_IDW_PANE_FIRST ,这将成为第一个窗口的ID 。
我们的源代码有了下列变化:
// in CHILDFRM。H
class CChildFrame : public CMDIChildWnd
{
protected:
CSplitterWnd m_wndSplitter;
protected:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs; CCreateContext* pContext);
。。。
};
// 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
656
…………………………………………………………Page 719……………………………………………………………
第 11 章 View 功能之加強與重繪效率之提昇
pContext);
}
本章回顾
这一章里我们追求的是精致化。
Scribble Step3 已经有绘图、文件读写、变化笔宽的基本功能,但是「连接到同一份
Document 的不同的Views 」之间却不能够做到同步更新的视觉效果,此外View 窗口
中没有滚动条也是遗憾的事情。
Scribble Step4 弥补了上述遗憾。它让「连接到同一份Document 的不同的Views 」之间
做到同步更新…关键在于CDocument::UpdateAllViews 和CView::Update 两个虚拟函
式。而由于同步更新引发的绘图效率问题,所以我们又学会了如何设计所谓的hint ,让
绘图动作更聪敏些。也因为hint 缘故,我们改变了Document 的格式,为每一线条加上
一个外围四方形记录。
在滚动条方面,MFC 提供了一个名为CScrollView 的类别,内有滚动条功能,因此直接拿来
用就好了。我们唯一要担心的是,从CView 改为CScrollView,原先的OnDraw 绘图动
作要不要修改?毕竟,卷来卷去把原点都不知卷到哪里去了,何况还有映射模式(坐标
系统)的问题。这一点是甭担心了,因为application framework 在调用OnDraw 之前,
已经先调用了OnPrepareDC,把问题解决掉了。唯一要注意的是,送进OnDraw 的滑
鼠坐标点应该改为逻辑坐标,以文件左上角为原点。DP2LP 函数可以帮我们这个忙。
此外,我们接触了另一种新而且更精致的UI 接口:分裂窗口,让一个窗口分裂为数个
窗口,每一个窗口容纳一个View 。MFC 提供CSplitterWnd 做此服务。
657
…………………………………………………………Page 720……………………………………………………………
第篇 深入 MFC 程式設計
658
…………………………………………………………Page 721……………………………………………………………
第 12 章 列印與預樱А
12
第 章
打印与预览
「打印」绝对是个大工程,「打印预览」是个更大的工程。如果你是一位SDK 程序员,