6.1 sdi 和 mdi 界面

21

Upload: taline

Post on 24-Jan-2016

90 views

Category:

Documents


0 download

DESCRIPTION

SDI. MDI. 6.1 SDI 和 MDI 界面. View1. View2. View N. SDI( S ingle D ocument I nterface, 单文档界面程序 ) MDI( M ulti- D ocument I nterface, 多文档界面 ). View. doc1. doc2. doc N. doc. 6.2 SDI 界面窗口的样式. 1. 在 MFC AppWizard 中确定窗口样式. 6.2 SDI 界面窗口的样式. 2. 在函数 PreCreateWindow 中修改窗口样式. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 6.1 SDI 和 MDI 界面
Page 2: 6.1 SDI 和 MDI 界面

6.1 SDI6.1 SDI 和和 MDIMDI 界面界面 SDI(SDI(SSingle ingle DDocument ocument IInterface, nterface, 单文档界面程序单文档界面程序 ))

MDI(MDI(MMulti-ulti-DDocument ocument IInterface, nterface, 多文档界面多文档界面 ))

doc1 doc2 docN

View1 View2 ViewN

MDIMDI

doc

View

SDISDI

Page 3: 6.1 SDI 和 MDI 界面

6.2 SDI6.2 SDI 界面窗口的样式界面窗口的样式1. 1. 在在 MFC AppWizardMFC AppWizard 中确定窗口样式中确定窗口样式

Page 4: 6.1 SDI 和 MDI 界面

6.2 SDI6.2 SDI 界面窗口的样式界面窗口的样式2.2. 在函数在函数 PreCreateWindowPreCreateWindow 中修改窗口样式中修改窗口样式

在创建窗口在创建窗口 (OnCreate)(OnCreate) 前一刻被调用,前一刻被调用,是一个虚函数,即可以被重写是一个虚函数,即可以被重写。。

参见参见 pp109 109 表表 6-16-1

Page 5: 6.1 SDI 和 MDI 界面

6.2 SDI6.2 SDI 界面窗口的样式界面窗口的样式2. 2. 在函数在函数 PreCreateWindowPreCreateWindow 中修改窗口样式中修改窗口样式

例例 6-16-1

例例 6-56-5

Page 6: 6.1 SDI 和 MDI 界面

6.2 SDI6.2 SDI 界面窗口的样式界面窗口的样式3. 3. 可拆分为小窗口的可拆分为小窗口的 SDISDI 界面界面

DocumentDocument

ViewView

Sub-viewSub-view Sub-viewSub-view Sub-viewSub-view

SDISDI 中只有一个文档,因此无论划分为多少个子视图中只有一个文档,因此无论划分为多少个子视图 (( 子窗口子窗口 )) ,依然对应的是一个,依然对应的是一个

DocumentDocument 类,但是各个子窗口的显示内容可以不同类,但是各个子窗口的显示内容可以不同;;

划分的子窗口个数可以用划分的子窗口个数可以用 M×NM×N 表示,其中表示,其中 MM 表示行数,表示行数, NN 表示列数。但是表示列数。但是 MM 和和 NN 均均

不能超过上限;不能超过上限; 划分实现有两种,即静态和动态划分,划分实现有两种,即静态和动态划分,

静态划分:行列数在拆分窗口被创建时就设置好了,用户不能更改。静态划分:行列数在拆分窗口被创建时就设置好了,用户不能更改。 动态划分:交互地修改拆分窗口的行列配置动态划分:交互地修改拆分窗口的行列配置

教材讲授的例子是动态划分方法,静态划分请参考相关资料。教材讲授的例子是动态划分方法,静态划分请参考相关资料。

Page 7: 6.1 SDI 和 MDI 界面

6.2 SDI6.2 SDI 界面窗口的样式界面窗口的样式3. 3. 可拆分为小窗口的可拆分为小窗口的 SDISDI 界面界面

注意变化注意变化

Page 8: 6.1 SDI 和 MDI 界面

6.3 6.3 拆分窗口的同步更新及更新效率拆分窗口的同步更新及更新效率1. 1. 拆分窗口的同步更新拆分窗口的同步更新

应用程序对所有的拆分窗口具有同步更新显示的能力,即某个窗口改变了文档数据后,其他窗口都应能立即显示修改后数据的变化。

实现依据: CDocument::UpdateAllViews

void UpdateAllViews(CView * pSender, // 该函数的调用者LPARAM lHint = 0L, CObject * pHint = NULL);

pSender : Points to the view that modified the

document, or NULL if all views are to be updated. 指定哪个视图对象不需要更新,若指定为 NULL 则更新所有视图。

Page 9: 6.1 SDI 和 MDI 界面

1. 1. 拆分窗口的同步更新拆分窗口的同步更新

例例 6-26-2

试一试:试一试: pDoc->UpdateAllViews(this);pDoc->UpdateAllViews(this);

Page 10: 6.1 SDI 和 MDI 界面

6.3 6.3 拆分窗口的同步更新及更新效率拆分窗口的同步更新及更新效率

2. 2. 提高拆分窗口更新效率的方法提高拆分窗口更新效率的方法

问题:问题: NN 个视图对应个视图对应 11 个文档,文档中数据发生变化且需要更新个文档,文档中数据发生变化且需要更新

所有视图,有时候会花费较多时间,严重将导致屏幕闪烁。所有视图,有时候会花费较多时间,严重将导致屏幕闪烁。

解决:只更新被修改的部分解决:只更新被修改的部分 (( 合适的矩形区域合适的矩形区域 )) 。。

理解视图类的成员函数理解视图类的成员函数 InvalidateRectInvalidateRect

需要更新的视图中的无效区域需要更新的视图中的无效区域(( 矩形区域矩形区域 ))

重新绘制时,是否删除无效区域内重新绘制时,是否删除无效区域内的原有内容的原有内容

1)1) InvalidateRectInvalidateRect 只对本视图有效只对本视图有效

2)2) 其他视图的重绘需要调用文档类的其他视图的重绘需要调用文档类的 UpdateAllViewsUpdateAllViews 来实来实

现现

Page 11: 6.1 SDI 和 MDI 界面

6.3 6.3 拆分窗口的同步更新及更新效率拆分窗口的同步更新及更新效率2. 2. 提高拆分窗口更新效率的方法提高拆分窗口更新效率的方法

理解文档类的成员函数理解文档类的成员函数 UpdateAllViewsUpdateAllViews

遗憾的是:本视图的无遗憾的是:本视图的无效区域是准确的,但是效区域是准确的,但是并没有传递给其他视图。并没有传递给其他视图。

Page 12: 6.1 SDI 和 MDI 界面

6.3 6.3 拆分窗口的同步更新及更新效率拆分窗口的同步更新及更新效率2. 2. 提高拆分窗口更新效率的方法提高拆分窗口更新效率的方法

理解文档类的成员函数理解文档类的成员函数 UpdateAllViewsUpdateAllViews

UpdateAllViews(CView * pSender, LPARAM lHint = 0L, CObject * pHint = NULL);

OnUpdate(Cview * pSender, LPARAM lHint, CObject * pHint);

InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE;

Page 13: 6.1 SDI 和 MDI 界面

6.3 6.3 拆分窗口的同步更新及更新效率拆分窗口的同步更新及更新效率2. 2. 提高拆分窗口更新效率的方法提高拆分窗口更新效率的方法

例 例 6-36-3 理解文档类的成员函数理解文档类的成员函数 UpdateAllViewsUpdateAllViews

step 1step 1

Page 14: 6.1 SDI 和 MDI 界面

6.3 6.3 拆分窗口的同步更新及更新效率拆分窗口的同步更新及更新效率2. 2. 提高拆分窗口更新效率的方法提高拆分窗口更新效率的方法

step 2step 2

step 3step 3

改写改写 OnUpdateOnUpdate

Page 15: 6.1 SDI 和 MDI 界面

6.4 6.4 创建带有滚动条的窗口创建带有滚动条的窗口

窗口显示的视图,可以是整窗口显示的视图,可以是整个视图区域的一部分。通过个视图区域的一部分。通过设置滚动条看到视图的其他设置滚动条看到视图的其他

区域。区域。

Page 16: 6.1 SDI 和 MDI 界面

6.4 6.4 创建带有滚动条的窗口创建带有滚动条的窗口

Page 17: 6.1 SDI 和 MDI 界面

6.4 6.4 创建带有滚动条的窗口创建带有滚动条的窗口

初始化滚动条初始化滚动条

Page 18: 6.1 SDI 和 MDI 界面
Page 19: 6.1 SDI 和 MDI 界面

6.4 6.4 创建带有滚动条的窗口创建带有滚动条的窗口

Page 20: 6.1 SDI 和 MDI 界面

6.4 6.4 创建带有滚动条的窗口创建带有滚动条的窗口

文档坐标与视图坐标的变换问题文档坐标与视图坐标的变换问题

CDC::DPtoLP CDC::DPtoLP (Device Points (Device Points → → Logical Points, View Logical Points, View → → Document)Document)

voidvoid DPtoLP(DPtoLP( LPPOINTLPPOINT lpPointslpPoints,, intint nCountnCount == 11 )) const;const;

voidvoid DPtoLP(DPtoLP( LPRECTLPRECT lpRectlpRect )) const;const;

voidvoid DPtoLP(DPtoLP( LPSIZELPSIZE lpSizelpSize )) const;const;

CDC::LPtoDP CDC::LPtoDP (Logical Points (Logical Points → → Device Points, Document Device Points, Document → →

View)View)

voidvoid LPtoDP(LPtoDP( LPPOINTLPPOINT lpPointslpPoints,, intint nCountnCount == 11 )) const;const;

voidvoid LPtoDP(LPtoDP( LPRECTLPRECT lpRectlpRect )) const;const;

voidvoid LPtoDP(LPtoDP( LPSIZELPSIZE lpSizelpSize )) const;const;

请先分析和观察:例请先分析和观察:例 6-4 (6-4 ( 无坐标变换的情况无坐标变换的情况 ))

Page 21: 6.1 SDI 和 MDI 界面

6.4 6.4 创建带有滚动条的窗口创建带有滚动条的窗口文档坐标与视图坐标的变换问题文档坐标与视图坐标的变换问题

例 例 6-46-4

CMFCexp6_6DocCMFCexp6_6Doc

坐标变换坐标变换