210 likes | 452 Views
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 中修改窗口样式.
E N D
SDI MDI 6.1 SDI和MDI界面 View1 View2 ViewN • SDI(Single Document Interface, 单文档界面程序) • MDI(Multi-Document Interface, 多文档界面) View doc1 doc2 docN doc
6.2 SDI界面窗口的样式 1. 在MFC AppWizard中确定窗口样式
6.2 SDI界面窗口的样式 2.在函数PreCreateWindow中修改窗口样式 在创建窗口(OnCreate)前一刻被调用,是一个虚函数,即可以被重写。 参见p109 表6-1
6.2 SDI界面窗口的样式 2. 在函数PreCreateWindow中修改窗口样式 例6-1 例6-5
View 6.2 SDI界面窗口的样式 Document Sub-view Sub-view Sub-view 3. 可拆分为小窗口的SDI界面 • SDI中只有一个文档,因此无论划分为多少个子视图(子窗口),依然对应的是一个Document类,但是各个子窗口的显示内容可以不同; • 划分的子窗口个数可以用M×N表示,其中M表示行数,N表示列数。但是M和N均不能超过上限; • 划分实现有两种,即静态和动态划分, • 静态划分:行列数在拆分窗口被创建时就设置好了,用户不能更改。 • 动态划分:交互地修改拆分窗口的行列配置 • 教材讲授的例子是动态划分方法,静态划分请参考相关资料。
6.2 SDI界面窗口的样式 3. 可拆分为小窗口的SDI界面 注意变化
6.3 拆分窗口的同步更新及更新效率 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则更新所有视图。
1. 拆分窗口的同步更新 例6-2 试一试:pDoc->UpdateAllViews(this);
6.3 拆分窗口的同步更新及更新效率 2. 提高拆分窗口更新效率的方法 问题:N个视图对应1个文档,文档中数据发生变化且需要更新所有视图,有时候会花费较多时间,严重将导致屏幕闪烁。 解决:只更新被修改的部分(合适的矩形区域)。 理解视图类的成员函数InvalidateRect 重新绘制时,是否删除无效区域内的原有内容 需要更新的视图中的无效区域(矩形区域) • InvalidateRect只对本视图有效 • 其他视图的重绘需要调用文档类的UpdateAllViews来实现
6.3 拆分窗口的同步更新及更新效率 2. 提高拆分窗口更新效率的方法 理解文档类的成员函数UpdateAllViews 遗憾的是:本视图的无效区域是准确的,但是并没有传递给其他视图。
UpdateAllViews(CView * pSender, LPARAM lHint = 0L, CObject * pHint = NULL); 6.3 拆分窗口的同步更新及更新效率 OnUpdate(Cview * pSender, LPARAM lHint, CObject * pHint); 2. 提高拆分窗口更新效率的方法 InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE; 理解文档类的成员函数UpdateAllViews
6.3 拆分窗口的同步更新及更新效率 2. 提高拆分窗口更新效率的方法 理解文档类的成员函数UpdateAllViews 例 6-3 step 1
6.3 拆分窗口的同步更新及更新效率 2. 提高拆分窗口更新效率的方法 step 2 改写OnUpdate step 3
6.4 创建带有滚动条的窗口 窗口显示的视图,可以是整个视图区域的一部分。通过设置滚动条看到视图的其他区域。
6.4 创建带有滚动条的窗口 初始化滚动条
6.4 创建带有滚动条的窗口 文档坐标与视图坐标的变换问题 CDC::DPtoLP (Device Points → Logical Points, View → Document) voidDPtoLP(LPPOINTlpPoints,intnCount=1)const; voidDPtoLP(LPRECTlpRect)const; voidDPtoLP(LPSIZElpSize)const; CDC::LPtoDP (Logical Points → Device Points, Document → View) voidLPtoDP(LPPOINTlpPoints,intnCount=1)const; voidLPtoDP(LPRECTlpRect)const; voidLPtoDP(LPSIZElpSize)const; 请先分析和观察:例6-4 (无坐标变换的情况)
6.4 创建带有滚动条的窗口 文档坐标与视图坐标的变换问题 例 6-4 CMFCexp6_6Doc 坐标变换