28、深入浅出MFC学习笔记,View功能的加强和重绘效率的提高

简介: 1、同一份Document的多个views,在Document的一个view改变了后,如何同步其它view呢?     让所有的Views 同步更新资料的关键在于两个函数:     1)CDocument::UpdateAllViews:这个函数会巡访所有隶属同一份Document的各个Views,找到一个就通知一个,而所谓「通知」就是调用其OnUpdate 函数。

1、同一份Document的多个views,在Document的一个view改变了后,如何同步其它view呢?

    让所有的Views 同步更新资料的关键在于两个函数:

    1CDocument::UpdateAllViews:这个函数会巡访所有隶属同一份Document的各个Views,找到一个就通知一个,而所谓「通知」就是调用其OnUpdate 函数。

2CView::OnUpdate:我们可以在这个函数中设计绘图动作。或许是全部重绘,或许想办法只绘必要的一小部份。

wps_clip_image-14058

通常你不应该在OnUpdate 中执行绘图动作,所有的绘图动作最好都应该集中在OnDraw;你在OnUpdate函数中的行为应该是计算哪一块区域需要重绘,然后调用CWnd::InvalidateRect,发出WM_PAINTOnDraw去画图。

    结论是,改善同步更新以及绘图效率的前置工作如下:

    1)定义hint 的数据类型,用以描述已遭修改的资料区域。

    2)当使用者透过View 改变了Document 内容,程序应该产生一个hint,描述此一修改,并以它做为参数,调用UpdateAllViews

3)改写CMyView::OnUpdate,利用hint 设计高效率绘图动作,使hint 描述区之外的区域不要重画。

virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );

2、默认情况下,OnUpdate 所收到的无效区(也就是重绘区),是Document Frame 窗口的整个内部。

3、带有滚动条的窗口的重绘

示例代码

CStroke* pStroke = (CStroke*)pHint;
CClientDC dc(this);
OnPrepareDC(&dc);
CRect rectInvalid = pStroke->GetBoundingRect();
dc.LPtoDP(&rectInvalid);
InvalidateRect(&rectInvalid);

其中,OnPrepareDC虚函数会因滑块的位置而调整DC原点;LPtoDP则是把装置位标改为逻辑坐标(以窗口绘图区左上角为原点的窗口坐标系统,改为以文件左上角为原点的逻辑坐标系统)。

4、大窗口中的小窗口,Splitter[1,P484]

参考

[1] 深入浅出MFC

目录
相关文章
|
9月前
|
前端开发 JavaScript API
如何实现两栏布局?这篇文章告诉你所有的细节!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
8月前
|
存储 开发框架 JavaScript
深入探讨Flutter中动态UI构建的原理、方法以及数据驱动视图的实现技巧
【6月更文挑战第11天】Flutter是高效的跨平台移动开发框架,以其热重载、高性能渲染和丰富组件库著称。本文探讨了Flutter中动态UI构建原理与数据驱动视图的实现。动态UI基于Widget树模型,状态变化触发UI更新。状态管理是关键,Flutter提供StatefulWidget、Provider、Redux等方式。使用ListView等可滚动组件和StreamBuilder等流式组件实现数据驱动视图的自动更新。响应式布局确保UI在不同设备上的适应性。Flutter为开发者构建动态、用户友好的界面提供了强大支持。
136 2
|
6月前
|
容器 C# 开发者
XAML语言大揭秘:WPF标记的魅力所在,让你轻松实现界面与逻辑分离,告别复杂代码!
【8月更文挑战第31天】XAML提供了一种直观且易于维护的界面设计方式,使得开发者可以专注于逻辑和业务代码的编写,而无需关心界面细节。通过数据绑定、布局管理和动画效果等特性,XAML可以实现丰富的界面交互和视觉效果。在实际开发过程中,开发者应根据具体需求选择合适的技术方案,以确保应用程序能够满足用户的需求。希望本文的内容能够帮助您在WPF应用程序开发中更好地利用XAML语言。
68 0
|
6月前
|
存储 缓存 前端开发
安卓开发中的自定义控件实现及优化策略
【8月更文挑战第31天】在安卓应用的界面设计中,自定义控件是提升用户体验和实现特定功能的关键。本文将引导你理解自定义控件的核心概念,并逐步展示如何创建一个简单的自定义控件,同时分享一些性能优化的技巧。无论你是初学者还是有一定经验的开发者,这篇文章都会让你对自定义控件有更深的认识和应用。
带你读《深入浅出Dart》二十五、Widget和布局(2)
带你读《深入浅出Dart》二十五、Widget和布局(2)
|
Dart 前端开发 容器
带你读《深入浅出Dart》二十五、Widget和布局(1)
带你读《深入浅出Dart》二十五、Widget和布局(1)
|
Web App开发 JavaScript 前端开发
性能优化之通俗易懂学习requestAnimationFrame和使用场景举例
性能优化之通俗易懂学习requestAnimationFrame和使用场景举例
254 0
|
API Android开发
Material Design 实战 之 第六弹 —— 可折叠式标题栏(CollapsingToolbarLayout) & 系统差异型的功能实现(充分利用系统状态栏空间)
Material Design 实战 之 第六弹 —— 可折叠式标题栏(CollapsingToolbarLayout) & 系统差异型的功能实现(充分利用系统状态栏空间)
|
前端开发
flutter 中的列表的性能优化前奏
这里是坚果前端小课堂,大家喜欢的话,可以关注我的公众号“坚果前端,”,或者加我好友,获取更多精彩内容 嵌套列表 - ShrinkWrap 与 Slivers 使用 ShrinkWrap 的列表列表 下面是一些使用ListView对象呈现列表列表的代码,内部列表的shrinkWrap值设置为 true。shrinkWrap强行评估整个内部列表,允许它请求有限的高度,而不是通常的ListView对象高度,即无穷大!
291 0
flutter 中的列表的性能优化前奏
|
Dart JavaScript 前端开发
从渲染原理出发探究Flutter内存泄漏
# 背景 众所周知,内存的高低是评判一款app的性能优劣的重要的指标之一。作为开发者而言,都会尽可能的减少内存的使用,清除无用的内存块,从而减少整个app的内存使用量。这也是历来开发者是追求的目标。然而,开发者难免时常因为语言用法或者写法的缘故,导致该释放而未释放的对象迟迟未释放,从而内存泄漏,消耗殆尽内存空间,从而导致系统崩溃的情况。 如何更简单的帮助开发者分析、暴露且解决内存泄漏问
从渲染原理出发探究Flutter内存泄漏

热门文章

最新文章