Symbian C ++: carga y muestra la imagen desde un archivo .mbm
Pregunta
Tengo un archivo .mbm que copio en mi dispositivo usando esta línea en el archivo .pkg
"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"
Luego, en la función de dibujo de mi contenedor, hago esto ...
_LIT(KMBMFile , "\\resource\\apps\\MyApp.mbm" );
CFbsBitmap* iBitmap;
iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);
Sin embargo, la línea iBitmap- > Load (KMBMFile, 0);
genera un KERN-EXEC: 0 PANIC
" Este pánico se produce cuando el núcleo no puede encontrar un objeto en el índice de objeto para el proceso actual o el hilo actual usando el número de índice de objeto especificado (el número de identificador sin procesar). "
¿Alguien puede ver dónde me equivoco?
¡Gracias!
Solución
Estabas desreferiendo un puntero no inicializado, también puedes usar esto:
// 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 );
Otros consejos
He resuelto este problema, así que publicaré la respuesta aquí para futuros usuarios ...
Crea un archivo MBM en tu archivo MMP usando un fragmento de código como este
START BITMAP MyApp.mbm
HEADER
TARGETPATH \resource\apps
SOURCEPATH ..\gfx
SOURCE c24 background.bmp
END
asegúrese de que sus imágenes .bmp se guarden en 32 bits desde photoshop o similar
Luego, asegúrate de que tu archivo MBM se haya copiado en tu dispositivo en tu archivo PKG
"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"
Luego, en la función de dibujo de su contenedor, utilice un código como este ...
_LIT(KMBMFile , "C:\\RESOURCE\\APPS\\MyApp.mbm" );
CFbsBitmap* iBitmap = new (ELeave) CFbsBitmap;
TInt retval = iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);
Esto dibujará su mapa de bits en el punto superior izquierdo de la pantalla (útil para la imagen de fondo)
CCoeControl :: Draw ()
no debe fallar, y ciertamente no debe irse (no tiene ningún rastro .. L
). En el fragmento de código anterior hay dos llamadas potencialmente generadoras de errores: iBitmap
y iBitmap- > Load ()
. El mapa de bits debe asignarse previamente, no asignarse en Draw ()
; si hay un error, sucederán cosas malas.
Además, por convención, solo las variables de miembros de clase comienzan con 'i', que iBitmap
arriba no lo es.
Consulte Estándares de codificación de Symbian para obtener más detalles
Definitivamente no debes crear iBitmap en la función :: Draw, ya que podría irse. Mejor hacer eso en la construcción del CoeControl. Teóricamente, la llamada :: Load se podría manejar en :: Draw, ya que podría fallar por varias razones, y no todas pueden ser fatales. Sin embargo, puedes hacer esto con la misma facilidad al crear el Control, así que quizás sea mejor pensar un poco en ello. Yo diría que si el control está básicamente allí para contener el mapa de bits, entonces debería hacerlo en el ConstructL. Si hay varias cosas que hace el control, es posible que desee manejarlo en :: Draw.