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

目录
相关文章
|
5月前
|
存储 开发框架 JavaScript
深入探讨Flutter中动态UI构建的原理、方法以及数据驱动视图的实现技巧
【6月更文挑战第11天】Flutter是高效的跨平台移动开发框架,以其热重载、高性能渲染和丰富组件库著称。本文探讨了Flutter中动态UI构建原理与数据驱动视图的实现。动态UI基于Widget树模型,状态变化触发UI更新。状态管理是关键,Flutter提供StatefulWidget、Provider、Redux等方式。使用ListView等可滚动组件和StreamBuilder等流式组件实现数据驱动视图的自动更新。响应式布局确保UI在不同设备上的适应性。Flutter为开发者构建动态、用户友好的界面提供了强大支持。
90 2
|
3月前
|
容器 C# 开发者
XAML语言大揭秘:WPF标记的魅力所在,让你轻松实现界面与逻辑分离,告别复杂代码!
【8月更文挑战第31天】XAML提供了一种直观且易于维护的界面设计方式,使得开发者可以专注于逻辑和业务代码的编写,而无需关心界面细节。通过数据绑定、布局管理和动画效果等特性,XAML可以实现丰富的界面交互和视觉效果。在实际开发过程中,开发者应根据具体需求选择合适的技术方案,以确保应用程序能够满足用户的需求。希望本文的内容能够帮助您在WPF应用程序开发中更好地利用XAML语言。
40 0
|
6月前
|
XML Java Android开发
Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
257 0
|
6月前
Qt6学习笔记十二(事件分发器、事件过滤器)
Qt6学习笔记十二(事件分发器、事件过滤器)
80 0
|
6月前
|
缓存
CocosCreator 面试题(十二)Cocos Creator Label 的原理以及如何减少Drawcall
CocosCreator 面试题(十二)Cocos Creator Label 的原理以及如何减少Drawcall
353 0
|
JSON 数据格式
通过一个具体的例子,深入了解 SAP UI5 控件数据双向绑定的工作原理和问题排查方法试读版
通过一个具体的例子,深入了解 SAP UI5 控件数据双向绑定的工作原理和问题排查方法试读版
Flutter(十五)——动画的封装与简化
Flutter(十五)——动画的封装与简化
169 1
Flutter(十五)——动画的封装与简化
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
|
iOS开发
iOS动画开发之二——UIView动画执行的另一种方式
iOS动画开发之二——UIView动画执行的另一种方式
123 0