![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
お世話になっております。
またまた質問ですが、
画像を表示したいので、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;
..............................................................................
画像は、リソースで追加→既存の項目→ピクチャ
でやりました。
それで、ピクチャからプロジェクトのファイルに移動させました。
それでもできません。
一体どのようにやればいいのでしょうか。
わかりやすく教えてください。
No.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に変更してもやってみましたが、変化なし、です。
すいません、本当は補足にしたかったんですが・・・
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にあるようなのですが・・・
No.3
- 回答日時:
こんにちは。
的外れな部分もあるかもしれませんが、下記の件についてもう一度確認されて
みては如何でしょうか?
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にしました。
No.2
- 回答日時:
>static HDC memdc;
>としましたが、それではだめなのでしょうか?
寿命としては大丈夫…かと。
となると、次はLoadImage()がエラーになっていないか…でしょうか。
エラーの場合はGetLastError()でエラーコードの確認…でしょうな。
>画像は、リソースで追加→既存の項目→ピクチャ
>でやりました。
ビットマップリソースとして取り込んだのであれば…引数が違うかと思われますが……
.rcにはどう書かれていますか?
この回答への補足
画像を表示するには、リソースに追加する必要があると思ったので・・・
↑のかたが、ファイルから読み込むならあってると思うとおっしゃってたので、リソースの方は消しました。
No.1
- 回答日時:
>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」は別のモノだったりしますが…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Perl 画像が表示でnull; this.src 1 2022/04/19 11:31
- Android(アンドロイド) AQUOS ZEROの使い方教えて下さい 2 2022/03/27 17:21
- Windows 8 Route Generator の使い方 1 2023/05/03 00:36
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Microsoft Access エラー 3051
-
ASP上でFileSystemObjectのDele...
-
VBAでファイルパスが長すぎてコ...
-
VBSで指定したフォルダにファイ...
-
エクセルVBA フォームを開く時...
-
オンラインスキャンをしようと...
-
CSVファイルの出力に関して
-
VBAでFTPファイル転送がうまく...
-
【Excel VBA】PDFを作成して,...
-
グーグルドライブからコピーし...
-
フォルダ参照ではなくファイル...
-
ADODB.Recordsetを使用してExce...
-
Refreshで落ちる
-
Excelでdatファイルを作成??
-
テキストファイルの文字色に色...
-
バッチによるショートカットの...
-
複数のファイルを同時検索し、...
-
batファイル処理でのテキストフ...
-
WindowsLiveメール2012の保存フ...
-
HTMLプログラムにExcelをリンク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでファイルパスが長すぎてコ...
-
Microsoft Access エラー 3051
-
Lubuntuでフォントをインストー...
-
【Excel VBA】PDFを作成して,...
-
FFFTPでサーバに新規フォルダが...
-
Refreshで落ちる
-
Excel VBA シートを指定して...
-
OCXのライセンス
-
フォルダ参照ではなくファイル...
-
エクセルVBA フォームを開く時...
-
OpenOfficeの書式エラーの質問...
-
ASP上でFileSystemObjectのDele...
-
ExcelVBAで、隠しフォルダにあ...
-
VBAでFTPファイル転送がうまく...
-
グーグルドライブからコピーし...
-
EXCEL VBA ファイルが開かれて...
-
BASP21のアップロードについて
-
【python】pandasでExcel(...
-
ASP.NETで、別サーバーへファイ...
-
web.configファイル内、valueに...
おすすめ情報