Symbian C ++ - Charger et afficher une image à partir d'un fichier .mbm
Question
J'ai un fichier .mbm que je copie sur mon appareil en utilisant cette ligne dans le fichier .pkg
"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"
Ensuite, dans la fonction draw de mon conteneur, je le fais ..
_LIT(KMBMFile , "\\resource\\apps\\MyApp.mbm" );
CFbsBitmap* iBitmap;
iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);
Toutefois, la ligne iBitmap- > Load (KMBMFile, 0);
génère une PANIQUE KERN-EXEC: 0
"Cette panique est déclenchée lorsque le noyau ne peut pas trouver d'objet dans l'index d'objet pour le processus ou le thread en cours à l'aide du numéro d'index d'objet spécifié (le numéro de descripteur brut)."
Quelqu'un peut-il voir où je me trompe?
Merci!
La solution
Vous avez déréférencé un pointeur non initialisé, vous pouvez également utiliser ceci:
// 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 );
Autres conseils
J'ai résolu ce problème, je vais donc répondre ici pour les futurs visiteurs.
Créez un fichier MBM dans votre fichier MMP en utilisant un extrait de code comme celui-ci
START BITMAP MyApp.mbm
HEADER
TARGETPATH \resource\apps
SOURCEPATH ..\gfx
SOURCE c24 background.bmp
END
assurez-vous que vos images .bmp sont enregistrées au format 32 bits à partir de photoshop ou similaire
Assurez-vous que votre fichier MBM est copié sur votre appareil dans votre fichier PKG
"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"
Ensuite, dans la fonction draw de votre conteneur, utilisez un code tel que celui-ci.
_LIT(KMBMFile , "C:\\RESOURCE\\APPS\\MyApp.mbm" );
CFbsBitmap* iBitmap = new (ELeave) CFbsBitmap;
TInt retval = iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);
Ceci dessine votre bitmap en haut à gauche de l'écran (utile pour l'image d'arrière-plan)
CCoeControl :: Draw ()
le code ne devrait pas échouer, et ne devrait certainement pas quitter (il n'a pas de fin .. L
). L'extrait de code ci-dessus contient deux appels potentiellement générateurs d'erreurs - le constructeur iBitmap
et le code iBitmap- > Load ()
. Le bitmap doit être pré-alloué, et non alloué dans Draw ()
- s'il y a un congé, de mauvaises choses vont arriver.
De plus, par convention, seules les variables de membre de classe commençant par 'i', ce que iBitmap
ci-dessus n'est pas.
Voir Normes de codage Symbian pour plus de détails
Vous ne devez absolument pas créer iBitmap dans la fonction :: Draw car elle pourrait partir. Le mieux est de le faire dans le ConstructL du CoeControl. Théoriquement, l'appel :: Load pourrait être traité dans :: Draw car il pourrait échouer pour un certain nombre de raisons, qui ne sont pas toutes fatales. Vous pouvez tout aussi facilement le faire lors de la création du contrôle, alors il vaut peut-être mieux y penser un peu. Je dirais que si le contrôle est fondamentalement juste là pour contenir le bitmap, vous devriez le faire dans le ConstructL. Si le contrôle fait un certain nombre de choses, vous pouvez vouloir le gérer dans :: Draw.