Symbian C ++-.mbmファイルから画像を読み込んで表示する
質問
.pkgファイルのこの行を使用してデバイスにコピーする.mbmファイルがあります
"$(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 PANICを発生させます
"このパニックは、カーネルが、指定されたオブジェクトインデックス番号(生のハンドル番号)を使用して、現在のプロセスまたは現在のスレッドのオブジェクトインデックスでオブジェクトを見つけられない場合に発生します。
誰かが私が間違っている場所を見つけることができますか?
ありがとう!
解決
初期化されていないポインターを逆参照していましたが、これも使用できます:
// 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 );
他のヒント
この問題を解決したので、将来の見物人のために回答をここに投稿します。
このようなスニペットを使用して、MMPファイルにMBMファイルを作成します
START BITMAP MyApp.mbm
HEADER
TARGETPATH \resource\apps
SOURCEPATH ..\gfx
SOURCE c24 background.bmp
END
.bmp画像がフォトショップなどから32ビットで保存されていることを確認する
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
はありません)。上記のコードスニペットには、エラーを生成する可能性のある2つの呼び出しがあります- iBitmap
コンストラクターと iBitmap-&gt; Load()
。ビットマップは、 Draw()
で割り当てられるのではなく、事前に割り当てられる必要があります-休暇がある場合、悪いことが起こります。
また、慣例により、クラスメンバー変数のみが「i」で始まりますが、上記の iBitmap
はそうではありません。
詳細については、 Symbianコーディング標準をご覧ください p>
絶対に:: Draw関数でiBitmapを作成しないでください。 CoeControlのConstructLでそれを行うのが最善です。理論的には:: Load呼び出しは:: Drawで処理できますが、これはいくつかの理由で失敗する可能性があり、そのすべてが致命的ではない可能性があるためです。ただし、コントロールを作成するときにこれを簡単に行うことができます。そのため、少し考えてみることをお勧めします。コントロールがビットマップを含めるために基本的にそこにある場合、ConstructLでそれを行うべきだと思います。コントロールが行う処理が多数ある場合は、:: Drawで処理することをお勧めします。