1、第 6章Windows应用程序界面的设计邹昆Email:1第 6章 Windows应用程序界面的设计n 凡是对 Windows应用程序 有一定了解的人都知道, Windows应用程序 界面 具有大量的 窗口 和 对话框 。应用程序的窗口设计得好坏会直接影响到应用程序的质量。2本章主要内容n SDI界面和 MDI界面。n SDI界面窗口的样式。n 拆分窗口及其显示的同步更新。n 带有滚动条窗口的创建。36.1 SDI和 MDI界面n SDI(单文档界面 )n MDI(多文档界面 )MDI框架窗口是 CMDIFrameWnd派生类对象框架窗口中的子窗口是 CChildFrame派生类的对象46.2
2、 SDI界面窗口的样式n 使用 MFC可以设计多种样式的应用程序窗口。设计时,既可以 在向导 MFC AppWizard的各个对话框中以选项的方式确定程序的窗口样式 ,也可以 在框架窗口类的成员函数 PreCreateWindow中用代码来选择程序的窗口样式 。56.2.3 可拆分为小窗口的 SDI界面n 作用 :从不同位置观察大文档;针对同一文档提供不同视图。n 注意 : 在 MFC中只有具有 文档 /视图结构 的应用程序才可以设计可拆分窗口的界面,因为只有在这种结构中才能对同一文档对象建立多个视图对象。n 方法 :通过 MFC AppWizard66.3 拆分窗口的同步更新及更新效率6.3
3、.1 拆分窗口的同步更新n 为何要同步更新?n 如何同步更新?void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL ); 例 6-2 可以同步更新所有窗口的应用程序。76.3.2 提高拆分窗口更新效率的方法n 全部更新的潜在问题 :效率低,可能引起闪烁n 解决方法 :只更新被修改的部分1. 理解视图类的成员函数 InvalidateRectn 无效显示区 :需要重绘的矩形区域void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE ); 8
4、6.3.2 提高拆分窗口更新效率的方法2. 理解文档类的成员函数 UpdateAllViewsn 本视图更新使用 InvalidateRect来提高效率n 但其余视图还得通过 UpdateAllViews(this)问题 :如何让其他视图也仅对无效区域重绘呢?n 其实文档类的成员函数 UpdateAllViews之所以能够通知与文档对象对应的所有视图进行显示更新,是因为在 UpdateAllViews函数中调用了各个视图的成员函数 OnUpdate:virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );96.3.2 提高拆分窗口更新效率的方法n 图 6-13n 程序员应该设计一个以 CObject为基类的类,在该类中封装 无效区域 的相关 数据及算法 ,然后创建这个类的对象,并 以这个对象的指针作为实参 调用函数 UpdateAllViews,然后在函数 OnUpdate中计算出 无效区域 的矩形后,再调用 InvalidateRect函数来触发 OnDraw对无效区域进行重绘。10