symbian图像显示

在Symbian中,位图的管理由字体位图服务器负责,该服务器提供了专门处理位图的CFbsBitmap类。

    应用程序中所有的位图信息都放在一个叫做多位图文件的包中(后缀为.mbm),在mbm文件中对每一个位图都有一个枚举类型的值来引用,这个枚举值在.mbg文件中定义。Symbian对位图的操作包括构建多位图文件、位图的创建、装载和位图处理等。下面介绍详细步骤。

    1.生成多位图文件

    如果应用程序要使用多位图文件,通常的做法是将所有的位图添加到多位图文件中,然后通过引用每一个位图的枚举来使用位图。

    首先在.mmp文件中第一行加入LIBRARY           fbscli.lib

           是为了给Draw函数调用画图等函数提供接口

    其次需要在应用程序的mmp文件中把要使用的位图列举出来。

START BITMAP ImageTransit.mbm // (1)
HEADER // (2)
SOURCEPATH ../bmp // (3)
TARGETPATH /system/apps/ImageTransit // (4)
SOURCE c12 girl.bmp // (5)
END

    在mmp文件中(1)句定义多位图文件必须以START BITMAP开头。后面是多位图文件的文件名,注意多位图文件的文件名应该和应用程序的名称一致,只是扩展名为.mbm。接下来(2)句是一个HEADER字段,表示定义位图文件开始。(3)句SOURCEPATH字段指出位图文件的存放位置,这里应该使用相对路径。(4)句TARGETPATH是多位图文件,也就是samplecontrol.mbm存放的位置,通常放在"/system/apps/应用程序名"这个路径下面。(5)句的SOURCE字段列出每一个位图文件,一个位图文件使用一个SOURCE字段。c12用来指定该位图文件的色深。指定色深的语法格式为c[depth]。c表示彩色图片,depth用一个整数值表示深度,这里为12。最后以END表示结束。

    定义好mmp文件后,应用程序会产生一个对应的.mbg文件。应用程序在需要使用位图的文件中必须加上对.mbg文件的包含。生成的mbg文件是一个文本文件,它包含了位图枚举的定义。定义如下所示。

enum TMbmImageTransit
    {
     EMbmImageTransitTestl
    };

    EMbmImageTransitTest是程序要用到的位图的枚举值。枚举值的格式为EMbm+应用程序名+位图文件名。应用程序就是使用这些枚举值来使用位图文件的。

    2.创建并加载位图

    位图枚举值可以直接使用。但是如果要对位图进行处理,那么就应该创建位图对象。

void CSampleControlContainer::LoadBitMap()
    {
   CFbsBitmap* iBitmap = new (ELeave) CFbsBitmap(); // (1)
    _LIT(KMBMFILE, "//system//apps//ImageTransit/ImageTransit.mbm");(2)
    TFileName file(KMBMFILE);
    User::LeaveIfError(CompleteWithAppPath(file));
    User::LeaveIfError(iBitmap->Load(file, EMbmImageTransitTest));
    }

    (1)句中iBitmap是CFbsBitmap类的指针,函数首先创建了CFbsBitmap类的对象,并将该对象赋给iBitmap。接下来就可以调用CFbsBitmap的Load()函数装载位图。Load()函数需要多位图文件的路径以及装载位图的枚举值,指定装载的是哪个位图;mbm文件的路径由_LIT文字给出,该文件用于初始化TFileName对象。ComplateWithAppPath()函数用于给路径添加上诸如驱动器等信息。最后将mbm路径和位图枚举值传递给Load()函数就实现了位图的装载。

    (2)//system//apps//ImageTransit/ImageTransit.mbm是在sdk下面,主要是为了生成sis文件后在手机上安装是默认路径安装的,如果改为其他路径,在ps机和模拟器上不会错,但在手机上安装时可能会出错的。

    3.显示视图

    显示视图是在容器的Draw()函数中实现。CWindowGc提供了两个函数DrawBitMap()和Bitblt()来实现位图的绘制,这两个函数的原型为。

    virtual void DrawBitmap(const TPoint& aTopLeft, const CFbsBitmap* aSource);

    virtual void Bitblt(const TPoint& aPos, const CFbsBitmap* aDevice);

    除了参数不一样外,它们的效率也不相同。DrawBitmap()的效率要低一些,因为它要执行位图的缩放,而Bitblt()只需要进行位图块的传输,效率较高。因此在显示位图时尽量使用Bitblt()。

void CSampleControlContainer::Draw(const TRect& aRect) const
    {
    CWindowGc& gc = SystemGc();
    TPoint topLeft(30, 30);
    gc.BitBlt(topLeft, iBitmap);
    }

说明:在该文件中需要增加头文件

#include "ImageTransit.mbg"
#include <aknutils.h>

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值