Symbian C ++ - Laden und Anzeigebild aus .mbm Datei
Frage
Ich habe eine .mbm Datei, die ich auf mein Gerät mit dieser Zeile in der PKG-Datei zu kopieren
"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"
Dann in der Zeichenfunktion meines Container Ich tue dies ..
_LIT(KMBMFile , "\\resource\\apps\\MyApp.mbm" );
CFbsBitmap* iBitmap;
iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);
Doch die Linie iBitmap->Load(KMBMFile, 0);
wirft ein KERN-EXEC: 0 PANIC
„Diese Panik ausgelöst wird, wenn der Kernel nicht ein Objekt im Objektindex für den aktuellen Prozess oder aktuellen Thread mit der angegebenen Objekt Indexnummer (die rohe Handle-Nummer) finden kann.“
Kann mir jemand vor Ort, wo ich falsch gehe?
Danke!
Lösung
Sie wurden dereferencing einen nicht initialisierten Zeiger, könnten Sie auch diese verwenden:
// 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 );
Andere Tipps
ich dieses Problem gelöst haben, werden so Antwort hier für zukünftige lookers posten ..
Eine MBM-Datei in Ihrer MMP-Datei wie folgt einen Ausschnitt mit
START BITMAP MyApp.mbm
HEADER
TARGETPATH \resource\apps
SOURCEPATH ..\gfx
SOURCE c24 background.bmp
END
sicherzustellen, dass Ihre .bmp Bilder in 32 Bit von Photoshop gespeichert oder ähnlich
Dann sicher, dass Ihre MBM-Datei auf Ihr Gerät in der PKG-Datei kopiert wird,
"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"
Dann in der Zeichenfunktion des Containers verwenden Sie Code wie dies ..
_LIT(KMBMFile , "C:\\RESOURCE\\APPS\\MyApp.mbm" );
CFbsBitmap* iBitmap = new (ELeave) CFbsBitmap;
TInt retval = iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);
Dies wird Ihre Bitmap in dem oberen linken Punkt des Bildschirms (nützlich für Hintergrundbild)
zeichnen CCoeControl::Draw()
Code sollte nicht fehlschlagen, und soll auf jeden Fall nicht verlassen (es keine Hinter ..L
hat). Im Codeausschnitt oben gibt es zwei potentiell fehler Erzeugung Anrufe - iBitmap
Konstruktor und iBitmap->Load()
. Die Bitmap sollte vorbelegt, nicht in Draw()
zugeordnet werden. - wenn es ein Abschied schlechte Dinge passieren werden,
Auch durch die Konvention nur Klasse Membervariablen beginnen mit ‚i‘, der über iBitmap
nicht.
Siehe Symbian Coding Standards für mehr Details
Sie sollten auf jeden Fall nicht schaffen iBitmap in der Funktion :: Draw wie es verlassen kann. Beste, was in der ConstructL des CoeControl zu tun. Theoretisch könnte der :: Load Anruf in :: Draw behandelt werden, wie es für eine Reihe von Gründen fehlschlagen könnte, von denen nicht alle tödlich sein kann. Sie könnte genauso gut tun, wenn die Steuerung zu schaffen, obwohl, so ist es vielleicht am besten über sie ein wenig zu denken. Ich würde sagen, dass, wenn die Steuerung im Grunde nur dort die Bitmap enthalten, dann sollten Sie es in der ConstructL tun. Wenn es eine Reihe von Dingen, die die Steuerung der Fall ist, dann sollten Sie es zu handhaben in :: Draw.