LoadImage()を関数化したい – プログラミング – Home

LoadImage()を関数化したい
 
通知
すべてクリア

[解決済] LoadImage()を関数化したい


ロテス
 ロテス
(@ロテス)
ゲスト
結合: 10年前
投稿: 3
Topic starter  

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で描画が出来ていません。
どこか悪い点を指摘して頂けないでしょうか?


引用未解決
トピックタグ
しま
 しま
(@しま)
ゲスト
結合: 18年前
投稿: 123
 

>void bbb {
> m_hBmp = get(lpPath);
> m_bmpImg.SetBitmap(m_hBmp);
>}

上の関数 void bbb(){...} には引数がありませんが、関数内で宣言していない変数
lpPath を使っています。(少なくとも提示されている範囲では宣言が見当たらない)
m_hB,p = get(lpPath);
(1)この動作はどういうものを想定したものですか?
デバッグしてみて lpPath の値を調べてみてください。
(2)また、ハンドルがとれているようだとのことですが、どのようにして取れていると判
断なさいましたか?


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

部分抜き出しが他の部分カットしすぎなので何とも言えませんが……。

LoadImage()でLR_LOADFROMFILEなら第1引数はNULLでも問題ないんじゃないですかね?
# 第2引数で渡すパス名が正しいという前提は…言うまでもないかと思われますが。
# 相対パスで書いていた場合はカレントディレクトリにご注意を。(わりとありがち)

読み込みに失敗してハンドル取れていなければLoadImage()がNULLを返却するので、そち
らで確認は可能かも知れません。
で……m_bmpImgは何者?
吹っ飛ばない…ということであれば、有効なインスタンスが入っているんでしょうけど
そのインスタンスは期待しているモノ(コントロール)ですか?
# いろんな箇所で似た名前の変数使っていて、狙っているものと別のものに対して実施し
ている…とかないですよね?


返信引用
ロテス
 ロテス
(@ロテス)
ゲスト
結合: 10年前
投稿: 3
Topic starter  

返信遅くなってすいません。

手元にソースが無く、思い出しながら書いていたので大分抜けてしまっていました。
わかりにくい内容で申し訳ありません。
環境を書き忘れていましたが、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部分だけを関数化すると、なぜか描画が出来なくなってしまいます。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

> LPCTSTR lpPath = _T(C:\image.bmp);

この行も\が足りないので変ですよね。
つまり提示されたコードは、問題を起こすコードと同じではないと思われます。
実際、やってみてもなんのも問題も発見できません。

まぁそれは置いといて、
1.パスは正しい。
2.m_hBmpにNULLは戻っていない。
のに、CStatic::SetBitmapが失敗する可能性を考えると、

 1.引数 m_hBmp がビットマップのハンドルでない。
 2.m_hBmpが既に破棄されている。

などの場合と思われます。
つまり、get()の戻り値がそのような状態になっているのであろうと
想像できます。また、

 3.そもそ、SetBitmap()にm_hBmpではないものが渡された。

の可能性もありえるかもしれません、良く見直してみてはどうでしょう。
あとは、質問者さんがデバッグでステップ実行してみるしかないでしょう。


返信引用
ロテス
 ロテス
(@ロテス)
ゲスト
結合: 10年前
投稿: 3
Topic starter  

>仲澤@失業者さん
助言ありがとうございます。

が、申し訳ないのですがなぜか上手くいってしまいました。

上記で助言頂いたhInstをNULLに変更してリビルドしてみたところ、
正常にBMPが読み込まれ、描画もできました。
ここが原因だったのかと思い、NULLからhInstに戻しても
成功するままなので・・・・何が原因なのか分かっていません。

ビルド時の不要な情報が残っていたため、リビルドで治ったのかもしれません。
アドバイス頂いたのに申し訳ありません。ありがとうございました。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> // ↑でhRet にNULLが入り、描画も失敗している

とありますが、SetBitmap が NULL を返すのは必ずしも失敗を意味しませんよ。
SetBitmap は以前にセットしたビットマップのハンドルを返すので、それ以前に SetBitm
ap していなければ(初回の SetBitmap なら)成功時でも NULL を返します。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました