dポイントプレゼントキャンペーン実施中!

お世話になっております。
 
またまた質問ですが、
 
画像を表示したいので、BitBlt関数を使ってみたんですが、
 
エラーもなく、実行できました。
 
しかし、画像が表示されません。
 
サイトや本を何回も見て、間違いがないか見たんですけど、間違いがまったく見当たりません。
 
LRESULT CALLBACK VisualProc (
HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
) {

switch(uMsg) {
case WM_CREATE:
memdc = CreateCompatibleDC( NULL );
hBitmap = ( HBITMAP )LoadImage( NULL , TEXT("player.bmp") , IMAGE_BITMAP ,
0 , 0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION );
SelectObject(memdc, hBitmap);
return 0;
case WM_PAINT:
hdc = BeginPaint(VisualWnd,&ps);
BitBlt(hdc, 30,30, 34, 32, memdc, 0, 0, SRCCOPY);
EndPaint(VisualWnd,&ps);
return 0;

..............................................................................

画像は、リソースで追加→既存の項目→ピクチャ
でやりました。
それで、ピクチャからプロジェクトのファイルに移動させました。
 
それでもできません。
 
 
一体どのようにやればいいのでしょうか。
わかりやすく教えてください。

A 回答 (4件)

#3です。



#3の補足について。

> 1.はい、staticです。

それで大丈夫のはずです。

> 2.リソースは削除してやってみました。できません。

では、表示させたいビットマップファイルは実行ファイル(*.exe)とは別に存在
する(ファイル名"player.bmp"のファイルとして存在している)と言うことですね?

それならば"player.bmp"は、実行ファイル(*.exe)と同じフォルダ(ディレトリ)
に置いて下さい。

もしも、Debug版とRelease版で別々のフォルダに実行ファイルを作成している
場合は、"player.bmp"も両方のフォルダにそれぞれコピーしておいて下さい。
注)開発ツールの画面上のプロジェクトツリー等のフォルダではなく、実際の
  ディスク上のフォルダにビットマップファイルを置いて下さい。

なお、LoadImage関数の引数での"player.bmp"の記述をフルパス(ドライブ名
から始まるフルパス名)で指定した場合は、"player.bmp"を複数コピーする
必要はありません。

> 3.第一引数は、再描画するウィンドウのハンドルと本に書いてあったので、
> VisualWndにしました。

VisualWnd が示すウィンドウとは、アプリケーションのメインウィンドウ(クライ
アント領域)とは違うものなのでしょうか?

その本にどう書かれているか判りませんが、質問者さんが今回書かれた
プログラム(ソースコード)の内容により、関数の引数などの記述もその状況に
合わせて変更しなくてはいけません。

ですので、ご自分で記述した変数などの意味、及び、使用している関数等の
使い方、記述方法などをヘルプ、書籍、WEB等で調査しその内容をよく理解
した上でコードを記述なさって下さい。

取りあえず今回について言えば、VisualWnd の記述を VisualProc関数の引数
の記述にあわせて hWnd に変更して検証してみては如何でしょうか?

あと、デバッグ環境が使えるのならプログラムをステップ実行で実行しながら
各変数の値が正常か、及び、各関数の戻り値などが正常値で返されているか
どうかを一つ一つ検証しながらプログラムを追ってみることをお勧め致します。

以上です。

この回答への補足

こんなに丁寧に何回も説明してもらってるのにできません。すいません。
 
player.bmpは実行ファイルと同じフォルダに入れました。
hWndに変更してもやってみましたが、変化なし、です。

補足日時:2011/08/08 11:06
    • good
    • 0
この回答へのお礼

すいません、本当は補足にしたかったんですが・・・
 
hBitmap = ( HBITMAP )LoadImage( NULL , TEXT("player.bmp") , IMAGE_BITMAP ,
0 , 0 , LR_LOADFROMFILE);
if(hBitmap == NULL){
MessageBox(hWnd, TEXT("ビットマップ読み込み失敗"), NULL, MB_OK);
return 0;
}
 
というようにしたら、必ず失敗するので、原因はLoadImageにあるようなのですが・・・

お礼日時:2011/08/08 12:00

こんにちは。



的外れな部分もあるかもしれませんが、下記の件についてもう一度確認されて
みては如何でしょうか?

1)変数 memdc と hBitmapについて(#1さんの指摘事項)

変数 memdc と hBitmap については、コールバック関数(今回はVisualProc)の
先頭部分で、

  static HDC memdc;
  static HBITMAP hBitmap;

のように記述されているということで宜しいでしょうか?
だとすれば、これについては問題ないと思います。

memdc、hBitmap の両変数ともに、ウィンドウ終了時(WM_DESTROY)などに、
そのオブジェクトを破棄する必要がありますので、staticな変数にしておく必要
があると思います。

2)ビットマップの読込み方法について(#2さんの指摘事項)

ビットマップ("player.bmp")を外部ファイルとして実行時に読込むのであれば、
ご提示の LoadImage関数の記述で良いと思いますが、

そうではなくて、リソーススクリプト(*.rc)の指定により、実行ファイル自体に
ビットマップを取込んで使用する場合は、LoadImage関数の引数の記述の変更、
または、LoadBitmap関数の利用になると思います。

a)LoadImage関数でリソースのビットマップを読込む記述例
  hBmp = (HBITMAP)LoadImage( hInst,
    MAKEINTRESOURCE(IDB_BITMAP1),
    IMAGE_BITMAP,
    0, 0,
    LR_CREATEDIBSECTION );

b)LoadBitmap関数でリソースのビットマップを読込む記述例
  hBmp = LoadBitmap( hInst,
    MAKEINTRESOURCE(IDB_BITMAP1) );

上記の例で、
  ・hInst はアプリケーションのインスタンスハンドル
  ・IDB_BITMAP1 はビットマップのリソースID
とします。

3)BeginPaint関数 と EndPaint関数 の記述について

> case WM_PAINT:
> hdc = BeginPaint(VisualWnd,&ps);
> BitBlt(hdc, 30,30, 34, 32, memdc, 0, 0, SRCCOPY);
> EndPaint(VisualWnd,&ps);

この部分の BeginPaint と EndPaint の両関数の第1引数に指定している
VisualWnd はウィンドウハンドルのはずですが、これは何処で、何の値を
設定しているのでしょうか?

通常なら、コールバック関数(VisualProc)の第1引数で渡される hWnd を
指定すると思うのですが、この点は大丈夫でしょうか?

■参考サイト(MSDN)
LoadImage 関数
http://msdn.microsoft.com/ja-jp/library/cc364835 …
LoadBitmap 関数
http://msdn.microsoft.com/ja-jp/library/cc410429 …
BeginPaint 関数
http://msdn.microsoft.com/ja-jp/library/cc428337 …
EndPaint 関数
http://msdn.microsoft.com/ja-jp/library/cc428553 …

以上です。

この回答への補足

せっかく丁寧に説明してもらったのですが、まったくできません。
1.はい、staticです。
2.リソースは削除してやってみました。できません。
3.第一引数は、再描画するウィンドウのハンドルと本に書いてあったので、VisualWndにしました。

補足日時:2011/08/07 08:11
    • good
    • 0
この回答へのお礼

ありがとうございました。
どうやら、画像が原因だったようです。

お礼日時:2011/08/08 12:18

>static HDC memdc;


>としましたが、それではだめなのでしょうか?

寿命としては大丈夫…かと。
となると、次はLoadImage()がエラーになっていないか…でしょうか。
エラーの場合はGetLastError()でエラーコードの確認…でしょうな。

>画像は、リソースで追加→既存の項目→ピクチャ
>でやりました。

ビットマップリソースとして取り込んだのであれば…引数が違うかと思われますが……
.rcにはどう書かれていますか?

この回答への補足

画像を表示するには、リソースに追加する必要があると思ったので・・・
↑のかたが、ファイルから読み込むならあってると思うとおっしゃってたので、リソースの方は消しました。

補足日時:2011/08/07 07:48
    • good
    • 0
この回答へのお礼

ありがとうございました。
どうやら、画像が原因だったようです。

お礼日時:2011/08/08 12:18

>memdc = CreateCompatibleDC( NULL );


>hBitmap = ( HBITMAP )LoadImage( NULL , TEXT("player.bmp") , IMAGE_BITMAP ,
>0 , 0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION );

とりあえず、memdcとhBitmapはの寿命は大丈夫ですか?
hBitmapはすぐ使用しているので「エラーがなければ」問題ないとして、
memdcがローカル変数だったりすると
「WM_CREATEの時のmemdc」と「WM_PAINTの時のmemdc」は別のモノだったりしますが…。

この回答への補足

回答ありがとうございます。 
static HDC memdc;
としましたが、それではだめなのでしょうか?

補足日時:2011/08/06 19:49
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!