Draw()函数约定

摘要:《Symbian OS C++手机应用开发(第3卷)》深入介绍了Symbian操作系统C++手机开发的各方面知识,吸收了Symbian公司工程师的丰富经验,为使用 Symbian 操作系统 v9.0 及其以上版本的手机编写 C++应用程序提供了完整的基础知识体系。第17章介绍关于屏幕绘制所需要知道的更复杂更有效的知识。本节说的是Draw()约定。

Draw()约定

Symbian 操作系统控件使用 Draw()函数来实现 MVC 视图功能。CCoeControl::Draw()在coecntrl.h中被定义为:

 
 
  1. IMPORT_C virtual void Draw(const TRect& aRect) const;  

派生类将重写这一虚函数来绘制(或重绘)它的模型。在极少的情形中不重写这个函数,而使用默认实现,让控件仍保持空白。

因为严格来说,CCoeControl::Draw()是 MVC视图函数,它不应该更新模型。所以它是 const类型,且非异常退出。Draw()的实现禁止异常退出。

CGraphicsContext函数返回空值的另一个原因是:如果它们会失败,Draw()也会失败。

1.重绘处理

系统发起的重绘处理从窗口服务器开始,它检测何时需要重绘部分窗口。实际上,它保持窗口上的一个无效区域,并向拥有窗口的应用程序发送一个事件,要求它重绘无效区域。CONE 计算出与无效区域相交的控件,并为所有受影响的控件将事件转换为对Draw()的调用。系统发起的重绘必须和先前的绘制完全一样地重绘模型。

应用程序发起的重绘处理从应用程序开始(按照定义)。如果更新了模型,且需要重绘控件,只要简单地调用它的DrawNow()函数。DrawNow()是CCoeControl中的非虚函数,它的作用是:

告诉窗口服务器控件即将开始重绘;

调用Draw();

告诉窗口服务器控件已经完成重绘。 从理论上说,不需要为完成应用程序发起的重绘而编写任何新函数。只要调用DrawNow(),这样也随后调用了Draw()函数。

2.绘制到何处

可能只需要绘制(或重绘)控件的某一部分。为了理解这一点,需要区分如图17.6所示的4个区域。 

 

控件是窗口的一部分。窗口服务器识别窗口,也识别无效的窗口区域,即需要重绘的部分。Draw()函数必须绘制整个无效区域,但不可以在控件的边界之外进行绘制。

窗口将把绘制结果剪裁到无效区域,反过来,该区域显然受窗口本身边界的限制。 但是如果控件没有占据整个窗口,则由程序员负责确保重绘不会溢出控件的边界之外。 事实表明,该任务通常不太繁重:许多控件,比如按钮和连三子应用程序屏幕、矩形、直线和文本在任何情况下都确保在控件的边界之内绘制。

在极少数情况下并非如此,可以向图形上下文发出 SetClippingRect()调用,确保将来的绘制被剪裁到控件的矩形中。以下是这一章后面介绍的一个绘制示例。

  

这是必要的,因为surround有可能会比aDeviceRect更大,aDeviceRect是允许这段代码进行绘制的控件区域。如果愿意,可以用 CancelClippingRect()在以后取消它。但不管怎样,因为CGraphicsContext::Reset()完成了这一功能,而且在控件的每个Draw()之前都调用了Reset(),所以不需要从控件中显式地完成。

可以假定图形上下文在调用Draw()之前被重置。不要自己去重置它,也不要设置不需要的颜色和选项。 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22792065/viewspace-617741/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22792065/viewspace-617741/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值