首 页 | 新 闻 | Symbian | Android| Windows Mobile | J2ME | 下载中心 | 游戏策划招聘与求职 | 购书指南 | 视频教程
您现在的位置: 开发视界 >> 专家专栏 >> 剑走偏锋 >> 正文
Graphics(2)
作者:剑走偏锋    文章来源:本站原创    更新时间:2005-8-9 15:29:52
    绘图接近一个控制,他包含了CCoeControl(控制的基础类),依靠CWindowGc提供的方法来实现.我们可以使用CCoeControl::SystemGc来访问CWindowGc,也可以通过CEikonEnv::Static()->SystemGc()来访问CWindowGc的外部控制连接.
    
    为了获得一些屏幕显示的特性,比如显示模式,需要使用CWsScreenDevice提供的一些方法.而使用CWindowGc:evice方法也是可以实现的.

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

void CMyGameView:[img]/images/biggrin.gif[/img]raw( const TRect& /*aRect*/ [img]/images/wink.gif[/img] const

   {

   // Get the system graphics context

   CWindowGc& gc = SystemGc();

   // Set drawing settings

   gc.SetBrushStyle( CGraphicsContext::ESolidBrush [img]/images/wink.gif[/img];

   gc.SetBrushColor( KRgbRed [img]/images/wink.gif[/img];

   // Draw

   gc.DrawLine( TPoint(10,10), TPoint(30,10) [img]/images/wink.gif[/img];

   }

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

    Draw会被框架调用,而且Draw方法不能被直接调用.在如下情况下,Draw会被调用:
    1.一个窗口被创建以后
    2.其他事件,窗口内容不可用,例如处理重叠窗口
    3.CCoeControl:rawNow或CCoeControl:rawDeferred方法被调用时,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 [img]/images/wink.gif[/img];

   gc.SetBrushColor( KRgbRed [img]/images/wink.gif[/img];

   // Draw

   gc.DrawLine( TPoint(10,10), TPoint(30,10) [img]/images/wink.gif[/img];

 

   // End drawing

   Window().EndRedraw();

   gc.Deactivate();

   }
相关文章:
Symbian屏幕双缓冲&&DSA
Using Theme in an Application
Making TimeLine Control
Symbian sdk帮助-术语表D
Symbian sdk帮助-术语表O
Symbian sdk帮助-术语表W
深入hellogui.app
控制与复合控制
 

站点地图 | 加入收藏 | 联系站长 | 广告服务 |
QQ:280529124  Tel:0592-8271361 辽ICP备05021703号