プロが教えるわが家の防犯対策術!

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が入力されたら読み込んだ画像を表示!という形にしたいのですが、実際ウィンドウには表示されなくて悩んでいます。わかりにくくて誠に申し訳ありませんが、どなたかどうかご教授願えないでしょうか。何卒よろしくお願い致します。

A 回答 (2件)

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 );
}
といった具合で 使うオブジェクトのハンドルを確かめて使いましょう
    • good
    • 0
この回答へのお礼

教えてgooで質問したのは初めてですが、こんなに早くお返事が頂けるとは思ってもいませんでした!感激です;;アドバイスされた通りWM_KEYDOWNメッセージ内でLoadImage関数を使って画像を読み込み、WM_PAINTメッセージ内でSelectObjectや、BitBlt関数を使うと、入力されたキーによって画像が表示されましたT_T WM_PAINT内で描画処理をまとめたほうが良いと本で読んでいたので、そうするものなのかと思っていましたが、そうもいかないのですね。本当に助かりました!ありがとうございました^-^

お礼日時:2008/12/04 20:12

本来ならWindowクラスを生成する段階(WinMainなど)で hbitmapをNULLで初期化



WM_KEYDOWN内のLoadImageを実行した後で
if ( hbitmap == NULL ) {
  // エラーの場合の処理
}
といった記述をします

機能ごとに処理をまとめたほうが後でメンテナンスする場合分りやすいと思います
KEYDOWNイベントで描画もしてしまうと描画処理がばらばらになって
どこで処理されて今の結果になるのかが分らなくなってしまうことがあります
一時的な描画必要な場合はこの限りではありませんが ・・・
    • good
    • 0
この回答へのお礼

ふむふむ。なるほど。まだWindowsアプリケーションの勉強歴が短いので、効率のよい(保守性や整合性?と呼ばれるもの)コードの書き方などがよくわかっていませんでした><
redfox63さんのような専門家の方に言っていただくと安心してそういうものだと納得できます^-^2度も答えていただき誠にありがとうございました!助かりました。

お礼日時:2008/12/05 08:57

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