• 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

  • 相关阅读:
    TypeError: can't compare offset-naive and offset-aware datetimes bugfix
    pg_restore数据库恢复指令
    第四十期百度技术沙龙笔记整理
    JS事件模型小结
    matlab Newton method
    Markdown 语法的简要规则
    iOS社交分享Twitter、Facebook、拷贝到剪切板、LINE、及邮件
    Linux系统调用过程分析
    iOS自己定义返回button(不影响返回手势)
    MAVEN项目模块化
  • 原文地址:https://www.cnblogs.com/lebronjames/p/1807849.html
Copyright © 2020-2023  润新知