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