WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章手机编程Symbian程序开发Graphics(2)

Graphics(2)
作者:剑走偏锋  来源:开发视界  发布时间:2005-12-20 0:10:12
绘图接近一个控制,他包含了CCoeControl(控制的基础类),依靠CWindowGc提供的方法来实现.我们可以使用CCoeControl::SystemGc来访问CWindowGc,也可以通过CEikonEnv::Static()->SystemGc()来访问CWindowGc的外部控制连接.
    
    为了获得一些屏幕显示的特性,比如显示模式,需要使用CWsScreenDevice提供的一些方法.而使用CWindowGc:evice方法也是可以实现的.

    每一个控制都从CCoeControl继承了他所包含的一个Draw方法,然后在控制类中实现.下面代码是一个Draw方法的示例,也包含了如何使用CWindowGc.
以下内容为程序代码:

void CMyGameView:raw( const TRect& /*aRect*/  const

   {

   // Get the system graphics context

   CWindowGc& gc = SystemGc();

   // Set drawing settings

   gc.SetBrushStyle( CGraphicsContext::ESolidBrush ;

   gc.SetBrushColor( KRgbRed ;

   // Draw

   gc.DrawLine( TPoint(10,10), TPoint(30,10) ;

   }

    Draw方法的TRect参数说明了错误区域,需要被重画.(实际上,你不能在规定的区域外面画图,这样超过的部分会被剪裁掉.)有时候,给定的方形区域往往被忽视了,不过用redraw就很简单了.在很多情况下,尤其是在一些游戏里,出现这种情况的时候会重画整个控制.

    Draw会被框架调用,而且Draw方法不能被直接调用.在如下情况下,Draw会被调用:
    1.一个窗口被创建以后
    2.其他事件,窗口内容不可用,例如处理重叠窗口
    3.CCoeControl:drawNow或CCoeControl:drawDeferred方法被调用时,DrawNow调用立即绘图.当DrawDeferred只标记了控制区域不可用时,最终,窗口服务开始redraw方法.

    在游戏里,常常使用一个间隔事件短的Timer来控制屏幕显示的更新,你可以使用DrawDeferred方法来重画屏幕.因为DrawDeferred方法的优先级比较低,他可以等待用户输入被完全处理结束以后再进行重画.

    你不能认为每一次Draw方法的调用都是因为DrawDeferred方法被调用.DrawDeferred可以被多次使用,但是并不是每一次的DrawDeferred调用都会引起重画.因为DrawDeferred只是标记屏幕上不可用的区域,并发调用DrawDeferred在系统开始重画以前并没有效果.我们必须有计划的满足Draw方法,游戏的计算也不应该被Draw和时间器调用的DrawDeferred分开.通常情况下,使用Timer进行计算,而Draw只是显示当前需要显示的游戏部分.这样做不仅仅是因为redraw的问题,而且是为了将代码区分的更清楚.

    也可以不使用Draw事件来完成Draw到一个控制上面的功能,在框架调用Draw方法的时候被自动完成,这需要添加下面几步:
    1.CWindowGc::Activate来活动图形连接
    2.通知窗口服务,使用RWindow::BeginRedraw
    3.在控制上画
    4.使用RWindow::EndRedraw通知窗口服务,绘图结束
    5.使用RWindow::EndRedraw使图形连接不活动
    
    示例代码如下:
以下内容为程序代码:

void CMyGameView::MyDrawMethod()

   {

   // Get the system graphics context

   CWindowGc& gc = SystemGc();

 

   // Begin drawing

   gc.Activate(Window());

   // Window().Invalidate(); // for backed-up windows

   Window().BeginRedraw();

 

   // Set drawing settings

   gc.SetBrushStyle( CGraphicsContext::ESolidBrush ;

   gc.SetBrushColor( KRgbRed ;

   // Draw

   gc.DrawLine( TPoint(10,10), TPoint(30,10) ;

 

   // End drawing

   Window().EndRedraw();

   gc.Deactivate();

   }
[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码