- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
视图绘制 在CDrawView::OnDraw()内完成视图绘制工作。在以前的文档视结构程序中,在需要绘图的时侯都是绘制整个窗口。如果窗口只有很小的一部分被覆盖,是否可以只绘制那些需要重画的部分? 回答是肯定的,而且大部分程序都这么做了。 比如,象下图这种情况: 图8-5 窗口的重绘 当窗口2从窗口1上移开后,只需要重画阴影线所包围的区域就够了。 9.3 绘图程序 当Windows通知窗口要重绘用户区时,并非整个用户区都需要重绘,需要重绘的区域称为“无效矩形区”,如上图中的阴影区域。 用户区中出现一个无效矩形提示Windows在应用程序队列中放置WM_PAINT消息。由于WM_PAINT消息优先级最低,可调用UpdateWindows直接立即向窗口发送WM_PAINT消息,从而立即重绘。 无效矩形区限制程序只能在该区域中绘图,越界的绘图将被裁剪掉。下面三个函数与无效矩形有关: InvalidateRect 产生一个无效矩形,并生成WM_PAINT消息 ValidateRect 使无效矩形区有效 GetUpdateRect 获得无效矩形坐标(逻辑) 9.3 绘图程序 Windows为每个窗口保留一个PAINTSTRUCT结构,其中包含无效矩形区域的坐标值。 要想在自己的程序高效绘图、只绘制无效矩形,首先需要重载视图的OnUpdate成员函数。 virtual void CView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint ); 当调用文档的UpdateAllViews时,框架会自动调用OnUpdate函数,也可在视图类中直接调用该函数。 OnUpdate函数一般是这样处理的:访问文档,读取文档的数据,然后对视图的数据成员或控制进行更新,以反映文档的改动。可以用OnUpdate函数使视图的某部分无效。以便触发视的OnDraw,利用文档数据重绘窗口。缺省的OnUpdate使窗口整个客户区都无效,在重新设计时,要利用提示信息lHint和pHint定义一个较小的无效矩形。修改后的OnUpdate成员函数如清单8.5。 9.3 绘图程序 清单9.5 修改后的OnUpdate成员函数 void CDrawView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { // TODO: Add your specialized code here and/or call the base class // The document has informed this view that some data has changed. if (pHint != NULL) { if (pHint-IsKindOf(RUNTIME_CLASS(CStroke))) { // The hint is that a stroke as been added (or changed). // So, invalidate its rectangle. CStroke* pStroke = (CStroke*)pHint; CClientDC dc(this); OnPrepareDC(dc); 9.3 绘图程序 CRect rectInvalid = pStroke-GetBoundingRect(); dc.LPtoDP(rectInvalid); InvalidateRect(rectInvalid); return; } } // We cant interpret the hint, so assume that anything might // have been updated. Invalidate(TRUE); return; } 9.3 绘图程序 这里,传给pHint指针的内容是指向需要绘制的笔画对象的指针。采用强制类型转换将它转换为笔划指针,然后取得包围该笔划的最小矩形。 OnPrepareDC用于调整视图坐标原点。 由于InvalidateRect需要设备坐标,因此调用LPToDP(rectInvalid)将逻辑坐标转换为设备坐标。 最后,调用InvalidateRect是窗口部分区域“无效”,也就是视图在收到WM_PAINT消息后需要重绘这一区域。 9.3 绘图程序 InvalidateRect函数原型为: void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE ); 第一个参数是指向要重绘的矩形的指针,第二个参数告诉视图是否要删除区域内的背景。 这样,当需要重画某一笔划时,只需要重画
您可能关注的文档
最近下载
- 2025财务报销制度及报销流程.docx VIP
- 湖南省2025届高三九校联盟第一次联考 数学试卷(含答案解析).docx
- 美剧剧本绝望主妇台词本中英文对照精排版第一季第一集.pdf VIP
- 特种设备风险分级管控制度.docx VIP
- 设计与人文当代公共艺术超星尔雅学习通答案100分最新版.doc VIP
- Panasonic松下SL-SX510 使用说明书.PDF VIP
- 【新教材】2025-2026学年统编版(2024)三年级道德与法治上册第4课《科技力量大》课件.pptx
- 2016年房产新政最新消息最新购房契税政策标准.doc VIP
- 2025中国中医科学院中医药健康产业研究所(江西中医药健康产业研究院)招聘事业编制人员考试备考试题及答案解析.docx VIP
- 新人教版六年级数学上册第三单元分数除法解决问题分类训练.doc VIP
文档评论(0)