当前位置:
文档之家› Windows应用程序界面的设计
Windows应用程序界面的设计
2. 理解文档类的成员函数UpdateAllViews
❖ 本视图更新使用InvalidateRect来提高效率 ❖ 但其余视图还得通过UpdateAllViews(this) 问题:如何让其他视图也仅对无效区域重绘呢? ❖ 其实文档类的成员函数UpdateAllViews之所以能
够通知与文档对象对应的所有视图进行显示更新, 是因为在UpdateAllViews函数中调用了各个视图 的成员函数OnUpdate:
13
6.4 创建带有滚动条的窗口
例6-4 把例6-3的程序界面改为一个带有滚动条的 窗口,文档的宽为3000,高为2000,滚动 页为50,滚动行为10.
❖ 逻辑坐标:
CDC的作图函数均使用逻辑坐标
❖ 设备坐标:
消息响应函数均使用设备坐标
14
6.4 创建带有滚动条的窗口
❖ CView::OnPrepareDC
virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );
8
6.3.2 提高拆分窗口更新效率的方法
❖ 图6-13 ❖ 程序员应该设计一个以CObject为基类的类,在该
类中封装无效区域的相关数据及算法,然后创建这 个类的对象,并以这个对象的指针作为实参调用函 数UpdateAllViews,然后在函数OnUpdate中计算 出无效区域的矩形后,再调用InvalidateRect函数 来触发OnDraw对无效区域进行重绘。
4
6.2.3 可拆分为小窗口的SDI界面
❖ 作用:
从不同位置观察大文档; 针对同一文档提供不同视图。
❖ 注意:在MFC中只有具有文档/视图结构的应用程
序才可以设计可拆分窗口的界面,因为只有在这种 结构中才能对同一文档对象建立多个视图对象。
❖ 方法:通过MFC AppWizard
5
6.3 拆分窗口的同步更新及更新效率
virtual void OnPrepareDC( CDC* pDC, CPrintInfo* pInfo = NULL );
❖ CDC::DPtoLP
void DPtoLP( LPPOINT lpPoints, int nCount = 1 ) const; void DPtoLP( LPRECT lpRect ) const; void DPtoLP( LPSIZE lpSize ) const;
❖ 在程序框架向导MFC Wizard的第6步进行选 择。
11
6.4 创建带有滚动条的窗口
两种方法创建带滚动条窗口:
❖ 方法一:创建工程时在MFC AppWizard-Step 6中选 择CScrollView类为应用程序视图类的基类。 滚动条在哪里?
❖ 方法二:手动修改,将视图类的源文件和头文件中 的CView全部替换为CScrollView。 为何会出错?
9
6.3.2 提高拆分窗口更新效率的方法
例6-3 编写一个带有可拆分窗口的SDI应用程序,当 鼠标单击窗口用户区时,可以在鼠标位置出 现一个直径大小随机的圆。要求使用无效区 进行窗口显示的同步更新。
10
6.4 创建带有滚动条的窗口
❖ 为了使程序员可以很方便地创建各种不同形 式的程序界面,MFC以CView类为基类派生 了一些具有增强功能的派生类。
第6章 Windows应用程序界面的设计
❖ 凡是对Windows应用程序有一定了解的人都 知道,Windows应用程序界面具有大量的窗 口和对话框。应用程序的窗口设计得好坏会 直接影响到应用程序的质量。
1
本章主要内容
❖ SDI界面和MDI界面。 ❖ SDI界面窗口的样式。 ❖ 拆分窗口及其显示的同步更新。 ❖ 带有滚动条窗口的创建。
❖ CDC::LPtoDP
void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const; void LPtoDP( LPRECT lpRect ) const; void LPtoDP( LPSIZE lpSize ) const;
15
小结
❖ Windows应用程序的界面有单文档界面和多文档 界面的区别。
6.3.1 拆分窗口的同步更新 ❖ 为何要同步更新? ❖ 如何同步更新?
void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL );
例6-2 可以同步更新所有窗口的应用程序。
6
6.3.2 提高拆分窗口更新效率的方法
❖ 全部更新的潜在问题: 效率低,可能引起闪烁
❖ 解决方法:只更新被修改的部分 1. 理解视图类的成员函数InvalidateRect ❖ 无效显示区:需要重绘的矩形区域
void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
7
6.3.2 提高拆分窗口更新效率的方法
12
6.4 创建带有滚动条的窗口
❖ CView::OnInitialUpdate
virtual void OnInitialUpdate( ); 该函数只在生成视图对象且与文档结合时,被程序框架调 用一次,因此这是初始化滚动条参数的地方。
❖ CScrollView::SetScrollSizes
void SetScrollSizes( int nMapMode, SIZE sizeTotal, const SIZE& sizePage = sizeDefault, const SIZE& sizeLine = sizeDefault );
2
6.1 SDI和MDI界面
❖ SDI(单文档界面) ❖ MDI(多文档界面)
MDI框架窗口是CMDIFrameWnd派生类对象 框架窗口中的子窗口是CChildFrame派生类的对
象3Βιβλιοθήκη 6.2 SDI界面窗口的样式
❖ 使用MFC可以设计多种样式的应用程序窗口。 设计时,既可以在向导MFC AppWizard的各 个对话框中以选项的方式确定程序的窗口样 式,也可以在框架窗口类的成员函数 PreCreateWindow中用代码来选择程序的窗 口样式。