Symbian C ++ - загрузка и отображение изображения из файла .mbm - PullRequest
0 голосов
/ 06 января 2009

У меня есть файл .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 ]

3 голосов
/ 06 января 2009

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

// 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 голосов
/ 06 января 2009

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

Создайте файл 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);

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

1 голос
/ 07 января 2009

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

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

Подробнее см. Стандарты кодирования Symbian

0 голосов
/ 26 марта 2009

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

...