symbian 显示位图和SVG图(转)

显示位图和SVG图

先打包,在加载 ,最后绘画

打包位图资源 :
先把图片放到指定文件 夹,然后把大包脚本加入到程序 的mmp文件中(添加在end前的最后)
START BITMAP      graphic_bmp.mbm
HEADER
TARGETPATH        \resource\apps
SOURCEPATH        ..\picture\bmp
SOURCE            c24  image1.bmp
SOURCE            c24  image2.bmp
SOURCE            1  image2_mask.bmp
重新编译 后,编译器会把位图图标 打包到graphic_bmp.mbm中,把生成位图资源头文件graphic_bmp.mbg存储到SDK 的头文件目录中

打包svg图资源 :
建立一个mk文件,建立后,把svg资源的mk文件加入到bld.inf文件中
加一句:gnumakefile graphic_svg.mk
重新编译后,生成SVG图片资源文件graphic_svg.mif,生成的SVG图片资源头文件graphic_svg.mbg存储在SDK的头文件目录中。

图片的加载过程:
如果想在程序中绘制图片,首先需要把图片从多图片资源文件中加载到程序内存 中生成一个位图对象 ,然后就可以在程序中绘制图片了
//加载位图图片
//声明部分
        CFbsBitmap* iBackgroundImage;
    CFbsBitmap* iImage2;
CFbsBitmap* iImage2mask;
//每个成员变量加载一个位图,在程序中,要绘制的就是这些位图类CFbsBitmap对象
        在头文件中加入
        #include <aknutils.h>
        #include <graphic_bmp.mbg> // Bitmap enumeration

//实现部分,加载位图 ConstructL()函数 中
        _LIT(KBitmapPath, "\\resource\\apps\\graphic_bmp.mbm");

        TFileName bitmapFile (KBitmapPath);
        User::LeaveIfError (CompleteWithAppPath (bitmapFile));
       
        iBackgroundImage = iEikonEnv->CreateBitmapL( bitmapFile,EMbmGraphic_bmpImage1 );
        iImage2 = iEikonEnv->CreateBitmapL( bitmapFile,EMbmGraphic_bmpImage2 );
        iImage2mask = iEikonEnv->CreateBitmapL( bitmapFile,EMbmGraphic_bmpImage2_mask );

EMbmGraphic_bmpImage1是资源ID,在mbg文件中定义
enum TMbmGraphic_bmp
        {
        EMbmGraphic_bmpImage1,
        EMbmGraphic_bmpImage2,
        EMbmGraphic_bmpImage2_mask
        };

在用完后要删除位图对象
//在析构函数中删除
        delete iBackgroundImage;
        delete iImage2;
        delete iImage2mask;

//加载SVG图
//声明部分
    CFbsBitmap* iSoundSvg;  //图片会把SVG图转换成位图,如果要实现矢量拉伸,需要重新加载
CFbsBitmap* iSoundSvgMask;

//实现部分
#include <akniconutils.h>  // AknIconUtils类的定义
#include <graphic_svg.mbg> // Bitmap enumeration
        _LIT(KSvgPath, "\\resource\\apps\\graphic_svg.mif");
//加载svg矢量图
        TFileName svgFile (KSvgPath);
        User::LeaveIfError (CompleteWithAppPath (svgFile));
       
        AknIconUtils::CreateIconL(iSoundSvg, iSoundSvgMask, svgFile, EMbmGraphic_svgSound,EMbmGraphic_svgSound_mask);
        //iSoundSvg=AknIconUtils::CreateIconL(svgFile,EMbmGraphic_svgSound);
        AknIconUtils::SetSize(iSoundSvg, TSize(50,50), EAspectRatioNotPreserved);
        AknIconUtils::SetSize(iSoundSvgMask, TSize(50,50), EAspectRatioNotPreserved);

//用后同样要删除
        delete iSoundSvg;
        delete iSoundSvgMask;

图片的显示过程:
//Draw()函数中实现
        在设备绘图上下文类CWindowGc中绘制图形,CWindowGc是图形上下文CGraphicesContext类的派生类
        //清空窗口上的内容
        gc.SetPenStyle( CGraphicsContext::ENullPen );
        gc.SetBrushColor( KRgbGray );
        gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
        gc.DrawRect( aRect );
        gc.SetBrushStyle( CGraphicsContext::ENullBrush );
       
        //绘制客户区背景
        //gc.BitBlt( Rect().iTl,iBackgroundImage );
        gc.DrawBitmap(aRect,iBackgroundImage);  //通过拉伸的方式放缩要目标矩形中
       
        //在客户区的第一行绘制位图图标
        //绘制非透明位图,选择不含有“Masked”单词的函数就可以了
        TPoint ptPos=aRect.iTl;
        gc.BitBlt(ptPos,iImage2);  //绘制时保持原始大小
       
        //绘制透明位图,需要有相应的掩码图,只有使用两者结合才能显示成功
        TSize size=iImage2->SizeInPixels();
        TRect sourceRect( TPoint( 0,0 ),size);
        ptPos.iX+=size.iWidth;
        gc.BitBltMasked(ptPos,iImage2,sourceRect,iImage2mask,ETrue);
       
        //绘制放缩的透明位图
        ptPos.iX+=size.iWidth;
        size.iWidth*=2;
        size.iHeight*=2;
        TRect destRect(ptPos,size);
        gc.DrawBitmapMasked(destRect,iImage2,sourceRect,iImage2mask,ETrue);
       
        //在客户区的第2行绘制SVG图图标
        //绘制非透明SVG图
        ptPos=aRect.iTl;
        ptPos.iY+=100;
        gc.BitBlt(ptPos,iSoundSvg);
       
        //绘制透明SVG图
        TSize size2=iSoundSvg->SizeInPixels();
        TRect sourceRect2( TPoint( 0,0 ),size2);
        ptPos.iX+=size2.iWidth;
        gc.BitBltMasked(ptPos,iSoundSvg,sourceRect2,iSoundSvgMask,ETrue);

特殊效果绘图:
//无闪烁重绘
有大量的绘图操作时,程序刷新可能会出现闪烁
Symbian 中,出了提供窗口客户区的绘图上下文设备用于屏幕 绘图外,还提供了一个位图设备。
位图设备实际指向了一个内容中的位图对象,通过位图设备上下文,可以直接把图像绘制到位图上,也就是通过程序代码 直接在内存中绘图,然后把绘制好的位图复制到窗口客户区中。
实现步骤:
1)在Container的头文件中声明
            CFbsBitmap* iOffScreenBitmap;
            CFbsBitmapDevice* iOffScreenBitmapDevice;
            CFbsBitGc* iOffScreenBitmapGc;
           
            CFbsBitmap* iSoundSvg;
2)定义在后台绘画使用的位图、位图设备,位图上下文//ConstructL()
    //加载svg矢量图
        TFileName svgFile (KSvgPath);
        User::LeaveIfError (CompleteWithAppPath (svgFile));
       
        iSoundSvg=AknIconUtils::CreateIconL(svgFile,EMbmGraphic_svgSound);
        AknIconUtils::SetSize(iSoundSvg, TSize(50,50), EAspectRatioNotPreserved);
       
    // 创建离屏位图、位图设备、位图设备上下文
    iOffScreenBitmap = new ( ELeave ) CFbsBitmap();  //创建一个空的位图
    CleanupStack::PushL( iOffScreenBitmap );
    User::LeaveIfError( iOffScreenBitmap->Create( Rect().Size(),EColor4K ) ); //位图的尺寸设置 成与程序客户区的尺寸相同
    CleanupStack::Pop();
    iOffScreenBitmapDevice = CFbsBitmapDevice::NewL(iOffScreenBitmap );  //创建一个位图设备
    iOffScreenBitmapDevice->CreateContext( iOffScreenBitmapGc );                    //创建位图设备的位图设备上下文
3)在析构函数中加入
    delete iOffScreenBitmapGc;
        iOffScreenBitmapGc = NULL;
        delete iOffScreenBitmapDevice;
        iOffScreenBitmapDevice = NULL;
        delete iOffScreenBitmap;
        iOffScreenBitmap = NULL;
4)在位图上绘制图形
//清除位图设备下文中的背景
    iOffScreenBitmapGc->SetPenStyle( CGraphicsContext::ENullPen );
    iOffScreenBitmapGc->SetBrushColor( KRgbGray );
    iOffScreenBitmapGc->SetBrushStyle( CGraphicsContext::ESolidBrush );
    iOffScreenBitmapGc->DrawRect( aRect );
   
    iOffScreenBitmapGc->SetPenStyle(CGraphicsContext::ESolidPen);
    iOffScreenBitmapGc->DrawEllipse(Rect());
   
    iOffScreenBitmapGc->BitBlt(aRect.iTl,iSoundSvg);

//负责位图中已经绘制好的图形的到程序窗口客户区中
    CWindowGc& gc = SystemGc();
gc.BitBlt( Rect().iTl,iOffScreenBitmap );

效果
 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/linzhiji/archive/2010/01/29/5270522.aspx

原文地址:https://www.cnblogs.com/lebronjames/p/1807849.html