1 / 21

6.1 SDI 和 MDI 界面

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 中修改窗口样式.

taline
Download Presentation

6.1 SDI 和 MDI 界面

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. SDI MDI 6.1 SDI和MDI界面 View1 View2 ViewN • SDI(Single Document Interface, 单文档界面程序) • MDI(Multi-Document Interface, 多文档界面) View doc1 doc2 docN doc

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

  3. 6.2 SDI界面窗口的样式 2.在函数PreCreateWindow中修改窗口样式 在创建窗口(OnCreate)前一刻被调用,是一个虚函数,即可以被重写。 参见p109 表6-1

  4. 6.2 SDI界面窗口的样式 2. 在函数PreCreateWindow中修改窗口样式 例6-1 例6-5

  5. View 6.2 SDI界面窗口的样式 Document Sub-view Sub-view Sub-view 3. 可拆分为小窗口的SDI界面 • SDI中只有一个文档,因此无论划分为多少个子视图(子窗口),依然对应的是一个Document类,但是各个子窗口的显示内容可以不同; • 划分的子窗口个数可以用M×N表示,其中M表示行数,N表示列数。但是M和N均不能超过上限; • 划分实现有两种,即静态和动态划分, • 静态划分:行列数在拆分窗口被创建时就设置好了,用户不能更改。 • 动态划分:交互地修改拆分窗口的行列配置 • 教材讲授的例子是动态划分方法,静态划分请参考相关资料。

  6. 6.2 SDI界面窗口的样式 3. 可拆分为小窗口的SDI界面 注意变化

  7. 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则更新所有视图。

  8. 1. 拆分窗口的同步更新 例6-2 试一试:pDoc->UpdateAllViews(this);

  9. 6.3 拆分窗口的同步更新及更新效率 2. 提高拆分窗口更新效率的方法 问题:N个视图对应1个文档,文档中数据发生变化且需要更新所有视图,有时候会花费较多时间,严重将导致屏幕闪烁。 解决:只更新被修改的部分(合适的矩形区域)。 理解视图类的成员函数InvalidateRect 重新绘制时,是否删除无效区域内的原有内容 需要更新的视图中的无效区域(矩形区域) • InvalidateRect只对本视图有效 • 其他视图的重绘需要调用文档类的UpdateAllViews来实现

  10. 6.3 拆分窗口的同步更新及更新效率 2. 提高拆分窗口更新效率的方法 理解文档类的成员函数UpdateAllViews 遗憾的是:本视图的无效区域是准确的,但是并没有传递给其他视图。

  11. 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

  12. 6.3 拆分窗口的同步更新及更新效率 2. 提高拆分窗口更新效率的方法 理解文档类的成员函数UpdateAllViews 例 6-3 step 1

  13. 6.3 拆分窗口的同步更新及更新效率 2. 提高拆分窗口更新效率的方法 step 2 改写OnUpdate step 3

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

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

  16. 6.4 创建带有滚动条的窗口 初始化滚动条

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

  18. 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 (无坐标变换的情况)

  19. 6.4 创建带有滚动条的窗口 文档坐标与视图坐标的变换问题 例 6-4 CMFCexp6_6Doc 坐标变换

More Related