17.8 窗口服务器功能
自Symbian操作系统v7.0以来,为窗口服务器加入了重绘时各种复杂的功能。它们会影响在屏幕上绘制的结果,但R对写得不好的代码产生影响。
17.8.1 无闪烁重绘
重绘进行的方式在 Symbian 操作系统 v7.0 有所改变。在这之前,所有的组成重绘的绘制命令都由窗口服务器直接应用到屏幕上。从那之后,如果无闪烁重绘功能在系统中启用,当设备启动时,窗口服务器创建一个和屏幕一样大的位图,被称为离屏(offscreen)位图。这个位图用来构造重绘的结果,然后它的内容被复制到屏幕上。
当客户端调用 BeginRedraw(),窗口服务器把在那个窗口中所有激活的图形上下文从屏幕上重定向到离屏位图上。它也为需要重绘的区域把窗口的背景色绘制到离屏位图上。然后每个绘制命令都绘制到离屏位图上。当客户端调用 EndRedraw()时,重绘的区域从位图上复制到屏幕上。
没有离屏位图,闪烁可以以两种方式发生。首先,如果在重绘中一些像素绘制了两次,那么手机用户可能(尽管对于写得很好的代码不太可能发生)看到那些像素两次改变颜色;其次,如果在绘制的区域内有任何可见的小点,那么每次使用绘制基元时,小点将闪烁。采用无闪烁绘制,所有绘制操作更新离屏位图,屏幕像素只更新一次。很清楚的,这完全消除了闪烁的第一个来源,而且任何小点不能闪烁多于一次。实际上,小点根本不会闪烁,因为离屏位图以一种特殊方式复制到屏幕上,因而不会导致小点闪烁。
如果无闪烁绘制生效,更重要的是应用程序重绘操作会绘制到每个像素。不采用无闪烁重绘,一个没有绘制的像素经常继续使用应用程序之前绘制在屏幕上的颜色。尽管在多任务系统中,永远不能确保它会发生,但实践中常常发生,尤其是使用DrawNow()更新应用程序的一部分时(即先使区域无效,然后直接重绘它)。当使用无闪烁重绘,离屏位图以窗口的背景色开始,而不是它之前绘制的内容,因此在代码中不可能排除这样的错误。
无闪烁重绘只在启动时当窗口服务器中做了配置后才会生效。可以通过使用下面的函数为单个窗口关闭该功能,传入EFalse参数值。
- TInt RWindow::EnableOSB(TBool aStatus);
【责任编辑:
董书 TEL:(010)68476606】