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

Posted

技术标签:

【中文标题】Symbian C++ - 从 .mbm 文件加载和显示图像【英文标题】:Symbian C++ - Load and display image from .mbm file 【发布时间】:2009-01-06 13:11:50 【问题描述】:

我有一个 .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

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

谁能发现我哪里出错了?

谢谢!

【问题讨论】:

【参考方案1】:

你正在取消引用一个未初始化的指针,你也可以使用这个:

// 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 );

【讨论】:

【参考方案2】:

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

使用像这样的 sn-p 在 MMP 文件中创建一个 MBM 文件

START BITMAP    MyApp.mbm
HEADER
TARGETPATH      \resource\apps
SOURCEPATH      ..\gfx
SOURCE          c24 background.bmp
END

确保您的 .bmp 图像以 32 位格式保存在 Photoshop 或类似文件中

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

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

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

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

这将在屏幕的左上角绘制您的位图(用于背景图像)

【讨论】:

【参考方案3】:

CCoeControl::Draw() 代码不应该失败,当然也不应该离开(它没有尾随 ..L)。在上面的代码 sn-p 中,有两个可能会产生错误的调用 - iBitmap 构造函数和 iBitmap-&gt;Load()。位图应该是预先分配的,而不是分配在Draw() - 如果有一个假就会发生坏事。

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

详情请见Symbian Coding Standards

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Symbian C++ - 从 .mbm 文件加载和显示图像的主要内容,如果未能解决你的问题,请参考以下文章

Symbian 获取内容类型?

symbian C++ 精简库

symbian c++ 中使用 Carbide 的 tcp 连接

Mac OS X 下的 Symbian C++ 开发

如何在 Symbian C++ 中切换视图?

在 Symbian^3 中通过 VBO 方法加载 3D 对象时获取 KERN-EXEC 3,为啥?