设为首页 加入收藏

TOP

17.4.1 绘制到视图的一部分(2)
2013-10-07 01:03:41 来源: 作者: 【 】 浏览:61
Tags:17.4.1 绘制 一部分

DrawOneTile()函数定义如下:

 

现在在字符绘制到背景上之前,背景立即被清理,这样闪烁的机会要小很多。

如果只有某一个字符改变,这里有几个选择:首先,可以在控件上调用DrawNow(),对于这个简单例子可能已经足够好了。它导致绘制整个控件,并且窗口服务器为它处理所有的绘制。但是,我们可以比这个做得好得多。

一个停止窗口服务器处理所有绘制的方法是只在相关区域调用 Invalidate()(正如DrawDeferred()函数所做的)。

 

这引起窗口服务器为这个符号所在的矩形发送重绘事件。上面的代码将会和包含左边的符号的矩形一起调用;由于它根本没有注意到矩形,所有的一切仍然是绘制好的,但是窗口服务器将剪裁绘制到无效的区域上,在这个情况下就是左边的符号。但是,如果在收到重绘事件之前窗口的另一部分也变成无效的,那么传入的矩形可能会更大一些。如果窗口服务器功能在起作用,那么传递给重绘功能的矩形总是窗口的整个区域。

如何只绘制其中一个符号呢?要求的绘制函数是 COandXStatusWin::DrawOneTile()。应用程序代码不直接调用COandXStatusWin::Draw()函数;CoeControl框架完成一些设置然后调用它。为了调用COandXStatusWin::Draw()函数,需要完成一部分通常由框架来完成的设置工作。下面的函数只绘制一个符号,窗口服务器剪裁绘图到那个符号的区域。

 

这段代码是假定窗口在 RWindow(重绘窗口)中使用的前提下写的;如果它是备份窗口(RBackedUp 窗口),代码会产生严重错误,因为这类窗口不支持 Invalidate()、BeginRedraw()和EndRedraw()函数。但是,如果忽略这几行代码,那么代码能很好地为备份窗口工作。如果一个控件必须和两种类型的窗口工作,可以检查窗口类型,如果必要,跳过这些行。

有一个 CCoeControl 函数必须要考虑控件在哪种类型的窗口中显示。这是 DrawDeferred()函数,其行为在下面的代码中演示。

 

对于一个重绘窗口,它只使窗口的矩形区域无效。当控件最终从窗口服务器收到一个重绘事件,它将绘制窗口。在使用备份窗口的控件上,DrawDeferred()简单地调用 DrawNow(),使得立刻重绘窗口。

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

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇17.1.1 控件 下一篇17.4.1 绘制到视图的一部分(1)

评论

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