LoadImageでハンドルを取得し、BMPを表示する処理がたくさんあるため、
関数化したいと思っています。
しかし、関数化するとハンドルは取れるものの、
BMPの描画が出来なくなります。
HBITMAP m_hBmp;
CStatic m_bmpImage;
// 成功
void aaa {
HINSTANCE hInst = AfxGetInstanceHandle();
m_hBmp = (HBITMAP)LoadImage(hInst, lpPath, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
m_bmpImg.SetBitmap(m_hBmp);
}
----------------------------
// 失敗
void bbb {
m_hBmp = get(lpPath);
m_bmpImg.SetBitmap(m_hBmp);
}
HBITMAP get(LPCTSTR lpPath) {
HINSTANCE hInst = AfxGetInstanceHandle();
return (HBITMAP)LoadImage(hInst, lpPath, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
}
失敗のほうでも、m_hBmpでハンドルはとれているようなのですが
SetBitmapで描画が出来ていません。
どこか悪い点を指摘して頂けないでしょうか?
>void bbb {
> m_hBmp = get(lpPath);
> m_bmpImg.SetBitmap(m_hBmp);
>}
上の関数 void bbb(){...} には引数がありませんが、関数内で宣言していない変数
lpPath を使っています。(少なくとも提示されている範囲では宣言が見当たらない)
m_hB,p = get(lpPath);
(1)この動作はどういうものを想定したものですか?
デバッグしてみて lpPath の値を調べてみてください。
(2)また、ハンドルがとれているようだとのことですが、どのようにして取れていると判
断なさいましたか?
部分抜き出しが他の部分カットしすぎなので何とも言えませんが……。
LoadImage()でLR_LOADFROMFILEなら第1引数はNULLでも問題ないんじゃないですかね?
# 第2引数で渡すパス名が正しいという前提は…言うまでもないかと思われますが。
# 相対パスで書いていた場合はカレントディレクトリにご注意を。(わりとありがち)
読み込みに失敗してハンドル取れていなければLoadImage()がNULLを返却するので、そち
らで確認は可能かも知れません。
で……m_bmpImgは何者?
吹っ飛ばない…ということであれば、有効なインスタンスが入っているんでしょうけど
そのインスタンスは期待しているモノ(コントロール)ですか?
# いろんな箇所で似た名前の変数使っていて、狙っているものと別のものに対して実施し
ている…とかないですよね?
返信遅くなってすいません。
手元にソースが無く、思い出しながら書いていたので大分抜けてしまっていました。
わかりにくい内容で申し訳ありません。
環境を書き忘れていましたが、MFC/VS2012/Win7です。
lpPath にはフルパスが入っていて、m_bmpImage はピクチャコントロールです。
HBITMAP m_hBmp;
CStatic m_bmpImage;
// 成功
void aaa() {
LPCTSTR lpPath = _T(C:\image.bmp);
HINSTANCE hInst = AfxGetInstanceHandle();
m_hBmp = (HBITMAP)LoadImage(hInst, lpPath, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
HBITMAP hRet = m_bmpImage.SetBitmap(m_hBmp);
// ↑でhRetは値が入り、描画成功
}
----------------------------
// 画像描画失敗
void bbb() {
LPCTSTR lpPath = _T(C:\image.bmp);
m_hBmp = get(lpPath);
// m_hBmpはNULL以外が取れている
HBITMAP hRet = m_bmpImage.SetBitmap(m_hBmp);
// ↑でhRet にNULLが入り、描画も失敗している
}
HBITMAP get(LPCTSTR lpPath) {
HINSTANCE hInst = AfxGetInstanceHandle();
return (HBITMAP)LoadImage(hInst, lpPath, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
}
すくなくとも、aaa()では画像の描画が出来ているため、
パスが間違っていると言う事はありません。
LoadImge部分だけを関数化すると、なぜか描画が出来なくなってしまいます。
> LPCTSTR lpPath = _T(C:\image.bmp);
この行も\が足りないので変ですよね。
つまり提示されたコードは、問題を起こすコードと同じではないと思われます。
実際、やってみてもなんのも問題も発見できません。
まぁそれは置いといて、
1.パスは正しい。
2.m_hBmpにNULLは戻っていない。
のに、CStatic::SetBitmapが失敗する可能性を考えると、
1.引数 m_hBmp がビットマップのハンドルでない。
2.m_hBmpが既に破棄されている。
などの場合と思われます。
つまり、get()の戻り値がそのような状態になっているのであろうと
想像できます。また、
3.そもそ、SetBitmap()にm_hBmpではないものが渡された。
の可能性もありえるかもしれません、良く見直してみてはどうでしょう。
あとは、質問者さんがデバッグでステップ実行してみるしかないでしょう。
>仲澤@失業者さん
助言ありがとうございます。
が、申し訳ないのですがなぜか上手くいってしまいました。
上記で助言頂いたhInstをNULLに変更してリビルドしてみたところ、
正常にBMPが読み込まれ、描画もできました。
ここが原因だったのかと思い、NULLからhInstに戻しても
成功するままなので・・・・何が原因なのか分かっていません。
ビルド時の不要な情報が残っていたため、リビルドで治ったのかもしれません。
アドバイス頂いたのに申し訳ありません。ありがとうございました。
> // ↑でhRet にNULLが入り、描画も失敗している
とありますが、SetBitmap が NULL を返すのは必ずしも失敗を意味しませんよ。
SetBitmap は以前にセットしたビットマップのハンドルを返すので、それ以前に SetBitm
ap していなければ(初回の SetBitmap なら)成功時でも NULL を返します。