设为首页 加入收藏

TOP

17.8.2 重绘存储
2013-10-07 01:04:45 来源: 作者: 【 】 浏览:80
Tags:17.8.2 存储

17.8.2  重绘存储

当只有单个窗口能在屏幕上的任何点上对像素的颜色起作用时,使用单个重绘操作绘制屏幕的一部分是合理有效的。随着透明窗口的出现,几个窗口能对特殊的像素群的颜色有所贡献,因此对所有这些窗口的重绘是必要的。但很显然,这是不实际的,因而发明了重绘存储。尽管这和透明窗口一起被设计,但如果开启它,会对于所有应用程序的所有窗口均生效。它首先在Symbian操作系统v8.0中与透明窗口一起添加,但在其后的发布版本中有所改进。

应用程序第一次绘制它的窗口时,很可能它对于窗口的所有区域都重绘,窗口服务器存储该应用程序执行的所有绘制命令。如果晚些时候,窗口需要重绘,窗口服务器使用这些命令而不是发送重绘消息给客户端。这对于透明窗口尤其有用,因为所有对于相关区域的像素颜色有贡献的窗口能通过窗口服务器绘制,不用客户端的参与。在覆盖第一个窗口的窗口上绘制,然后该窗口消失的情况下,绘制存储对于非透明窗口也是有用的。存储的命令用来立即重绘窗口,而不是等待客户端进行重绘。

有了重绘存储,窗口服务器就能在更多的情况下绘制窗口而无需要求客户端重绘。记住当客户端想改变窗口内容时,它必须告诉窗口服务器,通过调用 Invalidate()要求重绘。幸运的是,这与客户端通常更新它的窗口的一部分时的方式相适应,因为 DrawNow()和 DrawDeferred()都调用 Invalidate()。

然而,当重绘存储是激活的时,拥有多于一个视图的客户端需要有额外的动作。考虑这样的情况,当一个视图可见,用户进行了改变应用程序模型的一些动作,然后切换到另一个视图。如 果没有重绘存储,第二个视图可能接收到重绘事件,因而会绘制它自己来反映出模型的改变。如果有重绘存储,在这个情况下第二个视图就不会接收到重绘事件, 因此它会继续演示没有改变的模型。为避免这个问题,客户端将需要在所有不可见视图上调用Invalidate(),可以在模型改变时,或者当这样的视图移到前端时。

当重绘存储对于窗口起作用时,窗口服务器总是试图保存可能允许它绘制窗口的一系列命令。结果,如果发生任何事情使得存储的命令过时,窗口服务器会丢弃该命令 ,发送一个完全的重绘窗口命令,因此它能创建一个存储命令的更新列表。会导致上述情况发生的操作包括:

在整个或者部分窗口调用Invalidate();

在部分窗口上进行重绘;

在窗口上进行一些非重绘的绘制操作;

滚动窗口;

改变窗口大小。 当重绘存储在窗口上起作用时,应用程序最好避免这些操作;如果使用它们且在它们后面的窗口是透明的,而且如果需要在透明窗口上绘图,它们很可能会被绘制上错误的内容。窗口服务器在启动时配置成使用或者不使用重绘存储。如果启用透明窗口,那么始终会使用重绘存储。它可以为特殊的窗口(除了透明窗口)打开或者关闭,通过调用下面函数完成。

  1. TInt RWindow::EnableRedrawStore(TBool aEnabled);  

在Symbian操作系统 v9.1中,扩展重绘存储以便更有效地处理客户端执行部分重绘的情况。在改变之前,客户端部分重绘导致窗口服务器扔掉所有存储的命令,然后强迫客户端执行全部的重绘。改变之后,对应于客户端部分重绘的命令,与它们指向的窗口部分一起,被简单地添加到重绘存储。窗口服务器因此能使用来自最初完整重绘的存储命令,以及来自之后的部分重绘命令继续绘制修改后的窗口内容。

在某些情况下,遵从一个复杂的绘制序列,窗口服务器对于存储指令的不断重复的执行可能会对应用程序的表现产生不利的影响。可以通过执行一个空的,或者几乎空的 BeginRedraw()- EndRedraw()序列来清除存储序列。

【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇17.7.2 Uikon调试键 下一篇17.7.5 透明窗口

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: