Symbian C ++ - 从.mbm文件加载并显示图像

时间:2009-01-06 13:11:50

标签: c++ mobile symbian carbide

我有一个.mbm文件,我使用.pkg文件中的这一行复制到我的设备

"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"

然后在我的容器的绘图功能中,我这样做..

_LIT(KMBMFile , "\\resource\\apps\\MyApp.mbm" );
CFbsBitmap* iBitmap;

iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);

然而,iBitmap->Load(KMBMFile, 0);行提出了一个KERN-EXEC:0 PANIC

“当内核无法使用指定的对象索引号(原始句柄号)在当前进程或当前线程的对象索引中找到对象时,会引发此恐慌。”

有人能找到我错的地方吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

您正在取消引用未初始化的指针,您也可以使用它:

// remember to include the EIK environemnt include file
#include <eikenv.h>

_LIT(KMBMFile , "\\resource\\apps\\MyApp.mbm" );
CFbsBitmap* iBitmap;

iBitmap = iEikonEnv->CreateBitmapL( KMBMFile, 0 );
gc.BitBlt( Rect().iTl, iBitmap );

答案 1 :(得分:2)

我已经解决了这个问题,所以将在这里为未来的观众发布答案..

使用这样的代码段

在MMP文件中创建MBM文件
START BITMAP    MyApp.mbm
HEADER
TARGETPATH      \resource\apps
SOURCEPATH      ..\gfx
SOURCE          c24 background.bmp
END

确保您的.bmp图片保存在来自Photoshop或类似网站的32位

然后确保您的MBM文件已复制到PKG文件中的设备

"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"

然后在你的容器的draw函数中使用这样的代码..

_LIT(KMBMFile , "C:\\RESOURCE\\APPS\\MyApp.mbm" );
CFbsBitmap* iBitmap = new (ELeave) CFbsBitmap;
TInt retval = iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);

这将在屏幕的左上角绘制位图(对背景图像很有用)

答案 2 :(得分:1)

CCoeControl::Draw()代码不应该失败,并且肯定不会离开(它没有尾随.. L)。在上面的代码段中,有两个可能产生错误的调用 - iBitmap构造函数和iBitmap->Load()。位图应该是预先分配的,而不是在Draw()中分配 - 如果有一个不好的事情会发生。

此外,按照惯例,只有类成员变量以“i”开头,而上面的iBitmap不是。

有关详细信息,请参阅Symbian Coding Standards

答案 3 :(得分:0)

你绝对不应该在:: Draw函数中创建iBitmap,因为它可能会离开。最好在CoeControl的ConstructL中做到这一点。从理论上讲,:: Load调用可以在:: Draw中处理,因为它可能由于多种原因而失败,并非所有这些都可能是致命的。你可以在创建Control时轻松地做到这一点,所以也许最好稍微考虑一下。我会说,如果控件基本上只是包含位图,那么你应该在ConstructL中进行。如果控件执行了许多操作,那么您可能希望在:: Draw中处理它。