Symbian C++ - загрузка и отображение изображения из файла.mbm

У меня есть файл.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 ПАНИКА

"Эта паника возникает, когда ядро ​​не может найти объект в индексе объекта для текущего процесса или текущего потока, используя указанный номер индекса объекта (необработанный номер дескриптора)".

Может кто-нибудь определить, где я иду не так?

Спасибо!

4 ответа

Решение

Вы разыменовывали неинициализированный указатель, вы также можете использовать это:

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

Я решил эту проблему, поэтому опубликую ответ здесь для будущих зрителей..

Создайте файл MBM в своем файле MMP, используя такой фрагмент

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

убедитесь, что ваши изображения.bmp сохранены в 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);

Это нарисует ваше растровое изображение в верхней левой точке экрана (полезно для фонового изображения)

CCoeControl::Draw() код не должен потерпеть неудачу, и, конечно, не должен уходитьL). В приведенном выше фрагменте кода есть два потенциально вызывающих ошибки вызова: iBitmap конструктор и iBitmap->Load(), Растровое изображение должно быть предварительно выделено, а не выделено в Draw() - если там будет отпуск, будут плохие вещи.

Кроме того, по соглашению только переменные-члены класса начинаются с 'i', что iBitmap выше нет.

См. Symbian Coding Standards для более подробной информации.

Вам определенно не следует создавать iBitmap в функции::Draw, поскольку она может выйти. Лучше всего это сделать в ConstructL CoeControl. Теоретически вызов:: Load может быть обработан в::Draw, поскольку он может завершиться неудачей по ряду причин, но не все из них могут быть фатальными. Вы можете так же легко сделать это при создании элемента управления, поэтому, возможно, лучше немного подумать об этом. Я бы сказал, что если элемент управления в основном только для того, чтобы содержать растровое изображение, то вы должны сделать это в ConstructL. Если есть несколько вещей, которые делает элемент управления, тогда вы можете захотеть обработать это в::Draw.

Другие вопросы по тегам