symbian 显示位图和SVG图

news/2025/2/26 7:32:35

显示位图和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 );

效果


http://www.niftyadmin.cn/n/2308405.html

相关文章

wireshark python数据解析_python构造wireshark可以解析的LTE空口数据

Wireshark是可以解析LTE的空口数据。但是在wireshark的实现中&#xff0c;这些数据都是被封装到UDP报文中。然后根据wireshark的格式文件对LTE的数据加上头信息。头信息的定义参考附件packet-mac-lte.h文件大致结构如下&#xff1a;typedef struct mac_lte_info{/* Needed for …

symbian 模拟器 中文显示

S60_5th_Edition_SDK_v0.9/epoc32/release/winscw/udeb/z/resource/fonts 这个目录下文件备份, 并删除, 在你的 Windows Font 目录下拷贝一个TTF 过来, 宋体,黑体,都成, 重起模拟器, 恭喜,能显示中文了, 但界面,还是英文的, 你的程序可以显示了

mysql cmd安装_mysql cmd 安装

1.下载Mysql安装包&#xff1a;mysql-5.6.12-win32.zip&#xff1b;2.解压安装到D:\__dev下&#xff1b;3.添加环境变量&#xff0c;创建MYSQL_HOME变量&#xff1b;MYSQL_HOMED:\_dev\mysql-5.6.12-win324.配置Path路径&#xff0c;、bin&#xff1b;%MYSQL_HOME%\bin;5.修改m…

symbian 获取屏幕 分辨率

TRect rect; //获取 当前屏幕 的区域并放入TRect 中 EScreen代表全屏可更换其他 AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EScreen, rect);

mysql c dll_libmysql_c.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家

如何选择&使用第一步&#xff1a;您从我们网站下载下来文件之后&#xff0c;先将其解压(一般都是zip压缩包)。第二步&#xff1a;然后根据您系统的情况选择X86/X64&#xff0c;X86为32位电脑&#xff0c;X64为64位电脑。 如果您不知道是X86还是X64&#xff0c;您可以点此链…

mysql管理员删除了怎么办_mysql 误删除所有用户解决办法

企业中误删除所有用户故障案例1.不小心删除了所有用户#1.查看用户mysql> select user,host from mysql.user;-----------------| user | host |-----------------| root | 127.0.0.1 || root | ::1 || | db02 || root | db02 || | localhost || root | localhost |---------…

Symbian关于listBox的常用技巧小结

其实官方出了一个关于LISTBOX的例子,例子很全基本包含了所有关于LISTBOX的应用.小弟根据自己的研究和自己开发中的经验在此总结一下.其实LISTBOX有多种方格用法都非常接近,精通一个后基本都会了.1.创建listboxvoid CSingleListBoxContainer::CreateList(){iListBox new (ELeav…

symbian 文件操作

为了使用文件服务器&#xff0c;调用者首先必须创建一个由RFs 类的实例来表示的文件服务器会话。 通过调用Connect()来初始化文件服务器会话&#xff0c;Connect()会返回错误代码。客户端应负责关闭已经连接的文件服务器会话。如果文件服务器会话是一个局部变量&#xff0c;那…