DrawOneTile()函数定义如下:
现在在字符绘制到背景上之前,背景立即被清理,这样闪烁的机会要小很多。
如果只有某一个字符改变,这里有几个选择:首先,可以在控件上调用DrawNow(),对于这个简单例子可能已经足够好了。它导致绘制整个控件,并且窗口服务器为它处理所有的绘制。但是,我们可以比这个做得好得多。
一个停止窗口服务器处理所有绘制的方法是只在相关区域调用 Invalidate()(正如DrawDeferred()函数所做的)。
这引起窗口服务器为这个符号所在的矩形发送重绘事件。上面的代码将会和包含左边的符号的矩形一起调用;由于它根本没有注意到矩形,所有的一切仍然是绘制好的,但是窗口服务器将剪裁绘制到无效的区域上,在这个情况下就是左边的符号。但是,如果在收到重绘事件之前窗口的另一部分也变成无效的,那么传入的矩形可能会更大一些。如果窗口服务器功能在起作用,那么传递给重绘功能的矩形总是窗口的整个区域。
如何只绘制其中一个符号呢?要求的绘制函数是 COandXStatusWin::DrawOneTile()。应用程序代码不直接调用COandXStatusWin::Draw()函数;CoeControl框架完成一些设置然后调用它。为了调用COandXStatusWin::Draw()函数,需要完成一部分通常由框架来完成的设置工作。下面的函数只绘制一个符号,窗口服务器剪裁绘图到那个符号的区域。
这段代码是假定窗口在 RWindow(重绘窗口)中使用的前提下写的;如果它是备份窗口(RBackedUp 窗口),代码会产生严重错误,因为这类窗口不支持 Invalidate()、BeginRedraw()和EndRedraw()函数。但是,如果忽略这几行代码,那么代码能很好地为备份窗口工作。如果一个控件必须和两种类型的窗口工作,可以检查窗口类型,如果必要,跳过这些行。
有一个 CCoeControl 函数必须要考虑控件在哪种类型的窗口中显示。这是 DrawDeferred()函数,其行为在下面的代码中演示。
对于一个重绘窗口,它只使窗口的矩形区域无效。当控件最终从窗口服务器收到一个重绘事件,它将绘制窗口。在使用备份窗口的控件上,DrawDeferred()简单地调用 DrawNow(),使得立刻重绘窗口。
【责任编辑:
董书 TEL:(010)68476606】