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

StackOverflow https://stackoverflow.com/questions/416451

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top