绘图接近一个控制,他包含了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();
}
| | |