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
"Эта паника возникает, когда ядро не может найти объект в индексе объекта для текущего процесса или текущего потока, используя указанный номер индекса объекта (необработанный номер дескриптора)".
Кто-нибудь может определить, где я иду не так?
Спасибо!
Решение
Вы разыменовывали неинициализированный указатель, вы также могли бы использовать это:
// 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-разрядном формате из 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);
Это позволит нарисовать ваше растровое изображение в верхней левой точке экрана (полезно для фонового изображения).
CCoeControl::Draw()
код не должен завершаться сбоем и, конечно же, не должен завершаться (у него нет завершения ..L
).В приведенном выше фрагменте кода есть два потенциально вызывающих ошибки вызова - iBitmap
конструктор и iBitmap->Load()
.Растровое изображение должно быть предварительно выделено, а не выделено в Draw()
- если будет отпуск, то произойдут плохие вещи.
Кроме того, по соглашению только переменные-члены класса начинаются с "i", которые iBitmap
вышесказанного нет.
Видишь Стандарты кодирования Symbian для получения более подробной информации
Вам определенно не следует создавать iBitmap в функции ::Draw, так как это может привести к сбою.Лучше всего сделать это в конструкции CoeControl.Теоретически вызов ::Load может быть обработан в ::Draw, поскольку он может завершиться неудачей по ряду причин, не все из которых могут оказаться фатальными.Однако вы могли бы с таким же успехом сделать это при создании элемента управления, так что, возможно, лучше немного подумать об этом.Я бы сказал, что если элемент управления в основном предназначен только для того, чтобы содержать растровое изображение, то вы должны сделать это в ConstructL.Если есть несколько функций, которые выполняет элемент управления, то вы можете захотеть обработать это в ::Draw .