Symbian C ++ - Carica e visualizza l'immagine dal file .mbm
Domanda
Ho un file .mbm che copio sul mio dispositivo usando questa riga nel file .pkg
"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"
Quindi nella funzione di disegno del mio contenitore lo faccio ..
_LIT(KMBMFile , "\\resource\\apps\\MyApp.mbm" );
CFbsBitmap* iBitmap;
iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);
Tuttavia la riga iBitmap- > Load (KMBMFile, 0);
genera un KERN-EXEC: 0 PANIC
" Questo panico viene sollevato quando il kernel non riesce a trovare un oggetto nell'indice oggetto per il processo corrente o il thread corrente utilizzando il numero indice oggetto specificato (il numero di handle non elaborato). "
Qualcuno può individuare dove sto sbagliando?
Grazie!
Soluzione
Stavi dereferenziando un puntatore non inizializzato, puoi anche usare questo:
// 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 );
Altri suggerimenti
Ho risolto questo problema, quindi pubblicherò la risposta qui per gli utenti futuri ..
Crea un file MBM nel tuo file MMP usando uno snippet come questo
START BITMAP MyApp.mbm
HEADER
TARGETPATH \resource\apps
SOURCEPATH ..\gfx
SOURCE c24 background.bmp
END
assicurati che le tue immagini .bmp vengano salvate a 32 bit da Photoshop o simili
Quindi assicurati che il tuo file MBM sia copiato sul tuo dispositivo nel tuo file PKG
"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"
Quindi nella funzione draw del tuo contenitore usa un codice come questo ..
_LIT(KMBMFile , "C:\\RESOURCE\\APPS\\MyApp.mbm" );
CFbsBitmap* iBitmap = new (ELeave) CFbsBitmap;
TInt retval = iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);
Questo disegnerà la tua bitmap nel punto in alto a sinistra dello schermo (utile per l'immagine di sfondo)
CCoeControl :: Draw ()
non dovrebbe fallire e certamente non dovrebbe andarsene (non ha tracce finali. L
). Nello snippet di codice sopra ci sono due chiamate potenzialmente generatrici di errori: il costruttore iBitmap
e il iBitmap- > Load ()
. La bitmap dovrebbe essere pre-allocata, non allocata in Draw ()
- se c'è un congedo accadranno cose brutte.
Inoltre, per convenzione, solo le variabili dei membri della classe iniziano con 'i', mentre iBitmap
non lo è.
Vedi Standard di codifica Symbian per maggiori dettagli
Non dovresti assolutamente creare iBitmap nella funzione :: Draw perché potrebbe uscire. Meglio farlo nel ConstructL di CoeControl. Teoricamente la chiamata :: Load potrebbe essere gestita in :: Draw poiché potrebbe fallire per una serie di ragioni, non tutte fatali. Potresti farlo altrettanto facilmente quando crei il Controllo, quindi forse è meglio pensarci un po '. Direi che se il controllo è praticamente solo lì per contenere la bitmap, allora dovresti farlo in ConstructL. Se ci sono un certo numero di cose che fa il controllo, allora potresti volerlo gestire in :: Draw.