Symbian绘图知识

Symbian绘图全过程

void CExampleControl::DrawBitmap( const TPoint& aPoint,
const CFbsBitmap* aBitmap )
{
// 获得系统图形场景及控制矩形区域
CWindowGc& gc = SystemGc();
// 建立绘制矩形区
TRect rect = TRect( aPoint,
TSize( aBitmap.iWidth, aBitmap.iHeight ) );
// 激活图形场景
ActivateGc();
// 使窗口失效
Window().Invalidate( rect );
Window().BeginRedraw( rect );
// 绘制一幅位图
gc.DrawBitmap( aPoint, aBitmap );
Window().EndRedraw();
// 终止图形场景的活动状态

DeactivateGc();
}


上述范例代码在参数aPoint所定义的地方绘制了一个CFbsBitmap。在这个范例中,值得注意的情况是:使用绘图场景前需要先激活它,而绘图结束后又需要终止其活动状态。当某个客户端开始绘图时,窗口服务器也需要相关信息。用BeginRedraw方法可以完成这一任务。Invalidate方法也是需要的,这是因为:窗口服务器只允许应用程序在一个失效的区域内绘图。由系统启动的重绘中,CONE激活绘图场景,并为某个应用程序调用BeginRedraw方法。这里并不一定要调用Invalidate方法,因为该窗口已经失效了- 这就是系统在第一时间启动重绘的原因。

 

DataAddress()用法

 

位图由CFbsBitmap类管理,这个类提供了用于创建位图和载入位图的方法,并定义了这些位图的色深和大小。这个类用RFbsSession类来访问FBS,由此隐藏了来自用户的会话类。CFbsBitmap还提供了直接访问位图的图像数据的一些方法。用DataAddress方法可以获取指向该数据地址的指针,而用GetScanLine方法则可以访问具体的扫描行。

    在FBS中,位图根据其大小被划分到两种堆中。大于4KB的位图和小于4KB的位图被存放到不同的堆栈中。这样的划分是为了防止产生文件碎片。当频繁创建并删除一些大位图时,用于大位图的栈就会自动进行碎片整理。由于碎片整理的需要,当正使用大位图文件的内容时,需要锁定这些堆。为了防止碎片整理和位图操作同时发生,TBitmapUtil类提供了对堆进行锁定和解锁的操作。只有直接编辑位图的图像数据时才需要对堆进行锁定操作,而绘图方法和复制方法都自动地提供了锁定功能。在下述范例中,如果是一个大位图的话就锁定FSB堆,并且向位图数据中填写从零开始的各种颜色。该范例假定这个位图针对每个像素使用16位数据,这对12位位图和16位位图都是有效的。

 

CODE:

//当大位图时所定堆
if ( bitmap->IsLargeBitmap() )
{
TBitmapUtil bitmapUtil( bitmap );
bitmapUtil.Begin( TPoint(0,0) );
}
// 编辑位图
TSize bitmapSize = bitmap->SizeInPixels();
TUint16* bitmapData = (TUint16*)bitmap->DataAddress();
TUint16 colour = 0;
for ( TInt y = 0; y < bitmapSize.iHeight; y++ );
{
for ( TInt x = 0; x < bitmapSize.iWidth; x++ )
{
*bitmapData++ = colour++;
}
}
// 释放堆
if ( bitmap->IsLargeBitmap() )
{
BitmapUtil.End();
}


为了使位图绘制的速度比使用CFbsBitmaps时的速度更快,窗口服务器提供了自己的位图类CWsBitmap。它通过掌控位图处理的所有权剔除了在窗口服务器和FBS之间所进行的多余的场景切换。CWsBitmap类从CFbsBitmap类继承而来,并且实现所有相同的方法。当对绘图速度有要求时,应使用CWsBitmap类而不是其基类。

为客户端窗口设置缓冲区

Symbian OS的GT版中,缓冲区容量是固定的640字节。60系列将缓冲区提高到了6400字节,并支持应用程序改变该缓冲区的容量。当绘制过程由许多绘制函数或大量文本组成时,大容量的缓冲区在各种应用中特别有价值。闪烁淡出中的情况就是如此。可以通过应用程序用户界面类中的ConstructL来改变缓冲区的容量。

ConstructL来改变缓冲区的容量。

CODE:

void CMyAppUi::ConstructL()
{
BaseConstructL();
//调用BaseContructL后可以设置WS缓冲区大小
RWsSession &ws = iEikonEnv->WsSession();
TInt bufsize = 10000;
ws.SetBufferSizeL(bufsize);
//继续进行一般的app UI构建
iMyView = new ( ELeave ) CMyMainView;
iMyView->ConstructL( ClientRect() );
AddToStackL( iMyView );
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值