Win32APIを使って入力されたキーによって表示する画像を変えるプログラムを今、VisualSutudio2005のVC++で作っている最中なのですが、
上手く画像が表示されず困っています。具体的には、キーボードからキーが入力されたらTranslateMessage関数でWM_CHARメッセージを送って、その値(wParam)をWM_CHARメッセージ内でTCHAR型の変数に代入し、InvalidateRect関数を使ってWM_PAINTメッセージを送って、再描画処理を行ってその中で、if(tchar == 'a') { hbitmap = (HBITMAP)LoadImage(NULL,BMP,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
SelectObject(hMemdc,hbitmap);
GetObject(hbitmap,sizeof(BITMAP),&bitmap);
BitBlt(painthdc,0,0,350,467,hMemdc,0,0,SRCCOPY); }
という処理をしてaが入力されたら読み込んだ画像を表示!という形にしたいのですが、実際ウィンドウには表示されなくて悩んでいます。わかりにくくて誠に申し訳ありませんが、どなたかどうかご教授願えないでしょうか。何卒よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
hbitmapにビットマップのハンドルは取得できているのでしょうか
どこまで実行が期待通りになっているのかを確かめましょう
普通は WndProcのswitch(message)のWM_KEYDOWNの処理でwParamが'A'ならば
hbitmap = LoadImage( NULL, "ファイルパス", IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE );
を実行
WM_PAINTの処理で
if ( hbitmap != NULL ) {
hOld= (HBITMAP)SelectObject( hMemdc, hbitmap );
BitBlt( paintdc, 0, 0, 350, 476, hMemdc, 0, 0, SRCCOPY );
SelectObject( hMemdc, hOld );
}
といった具合で 使うオブジェクトのハンドルを確かめて使いましょう
教えてgooで質問したのは初めてですが、こんなに早くお返事が頂けるとは思ってもいませんでした!感激です;;アドバイスされた通りWM_KEYDOWNメッセージ内でLoadImage関数を使って画像を読み込み、WM_PAINTメッセージ内でSelectObjectや、BitBlt関数を使うと、入力されたキーによって画像が表示されましたT_T WM_PAINT内で描画処理をまとめたほうが良いと本で読んでいたので、そうするものなのかと思っていましたが、そうもいかないのですね。本当に助かりました!ありがとうございました^-^
No.2
- 回答日時:
本来ならWindowクラスを生成する段階(WinMainなど)で hbitmapをNULLで初期化
WM_KEYDOWN内のLoadImageを実行した後で
if ( hbitmap == NULL ) {
// エラーの場合の処理
}
といった記述をします
機能ごとに処理をまとめたほうが後でメンテナンスする場合分りやすいと思います
KEYDOWNイベントで描画もしてしまうと描画処理がばらばらになって
どこで処理されて今の結果になるのかが分らなくなってしまうことがあります
一時的な描画必要な場合はこの限りではありませんが ・・・
ふむふむ。なるほど。まだWindowsアプリケーションの勉強歴が短いので、効率のよい(保守性や整合性?と呼ばれるもの)コードの書き方などがよくわかっていませんでした><
redfox63さんのような専門家の方に言っていただくと安心してそういうものだと納得できます^-^2度も答えていただき誠にありがとうございました!助かりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Windows 10 フォルダ内の全ての画像を矢印キーでスライドできるようにしたい 1 2022/10/21 12:53
- マウス・キーボード 不良表示キー(キーボード) 3 2022/04/27 10:53
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- C言語・C++・C# 【C++】IDirect3DSurfaceのディープコピーは可能ですか? 1 2022/07/06 02:47
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- PHP 記述のおかしいところを教えて下さい。 1 2023/02/03 11:25
- Windows 8 Route Generator の使い方 1 2023/05/03 00:36
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
switch の範囲指定
-
【Excel】特定の文字を含むセル...
-
Do~Loopした回数をカウントしたい
-
VBの質問#if 0 then ってどう...
-
EXCEL VBA マクロ 実行する度に...
-
DoEventsがやはり分からない
-
メルカリのメルカードで買い物...
-
インタラクティブの反対語は?
-
リョウ・・・量?料?
-
2重のDo~Loopは?
-
VB.NET Excelを読み込んでDataT...
-
FFTの結果ついて
-
タッチパッドはチャタリングは...
-
C# 画面のちらつきを解消したい
-
セルの値が0はクリアするマクロ
-
VBA SaveChanges 上書きされない
-
UMLでの例外処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
メルカリのメルカードで買い物...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
EXCEL VBA マクロ 実行する度に...
-
switch の範囲指定
-
DoEventsがやはり分からない
-
VBの質問#if 0 then ってどう...
-
UMLでの例外処理
-
Do~Loopした回数をカウントしたい
-
VB.NET Excelを読み込んでDataT...
-
月度は何て読みますか?
-
findは動くがfindnextがマクロ...
-
リョウ・・・量?料?
-
iD
-
VBA SaveChanges 上書きされない
-
Select Case文でこのようなこと...
-
Loadイベント中にほかのイベン...
-
セルの値が0はクリアするマクロ
おすすめ情報