解決済みの質問

画面の更新

開発環境
XP Home Edtion
Microsoft Visual C++ 2008 Express Edition
SQL Server2005 Express Edtion

ボタンを押すと画像を画面に表示させるというものを作っています、実行時は白紙の状態で、ボタンを押すとその値の画像が表示されるというものです。

HDC hMdc;
HBITMAP hbmp = (HBITMAP)LoadImage( NULL, dstLPCSTR3, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION );
hMdc= CreateCompatibleDC(hdc );
SelectObject(hMdc, hbmp );
BitBlt(hdc, 0, 0, 2000, 5000, hMdc, 0, 0, SRCCOPY);
DeleteDC(hMdc);
DeleteObject(hbmp);
これはボタンを押されたときの処理です。
判りにくいところもあると思いますがどうかよろしくお願いいたします。

投稿日時 - 2009-01-08 13:57:24

連想キーワード:

QNo.4613568

困ってます

質問者が選んだベストアンサー

>すいません
>>HDC hdc=GetDC(hWnd);
>をどこに置いたらよいのですか?
HDC hdc = BeginPaint(hWnd, &ps);
の代わりに置けばいいと思いますが・・。
まあ、
hMdc= CreateCompatibleDC(hdc );
の前ならどこでも。
最後に
ReleaseDC(hdc);
も忘れずに。

投稿日時 - 2009-01-09 14:12:23

お礼

ありがとうございました、できました。
お付き合いいただき感謝しております。

投稿日時 - 2009-01-10 02:05:12

ANo.6

0人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(5件中 1~5件目)

ANo.5

>HDC hdc = BeginPaint(hWnd, &ps);
BeginPaintはWM_PAINTハンドラで使うものです。
ボタンイベントの場合、
HDC hdc=GetDC(hWnd);
でいけると思います。

投稿日時 - 2009-01-09 13:42:48

お礼

すいません
>HDC hdc=GetDC(hWnd);
をどこに置いたらよいのですか?

投稿日時 - 2009-01-09 13:54:21

ANo.4

★アドバイス
・ボタン処理ルーチンに記述しているのなら画面更新しなくて正常です。
 ボタン処理ルーチンで画面更新する場合は
 (1)InvalidateRect関数を呼ぶ
 (2)InvalidateRect関数とUpdateWindow関数を呼ぶ
 一般にこのどちらかでしょう。

サンプル1:
ボタン処理()
{
 HBITMAP hbmp = (HBITMAP)LoadImage( NULL, dstLPCSTR3, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION );
 HDC hMdc = CreateCompatibleDC( hdc );
 SelectObject( hMdc, hbmp );
 BitBlt( hdc, 0, 0, 2000, 5000, hMdc, 0, 0, SRCCOPY );
 DeleteDC( hMdc );
 DeleteObject( hbmp );
 
 InvalidateRect( hWnd, NULL, TRUE ); ←追加部分
}

サンプル2:
ボタン処理()
{
 HBITMAP hbmp = (HBITMAP)LoadImage( NULL, dstLPCSTR3, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION );
 HDC hMdc = CreateCompatibleDC( hdc );
 SelectObject( hMdc, hbmp );
 BitBlt( hdc, 0, 0, 2000, 5000, hMdc, 0, 0, SRCCOPY );
 DeleteDC( hMdc );
 DeleteObject( hbmp );
 
 InvalidateRect( hWnd, NULL, TRUE ); ←追加部分
 UpdateWindow( hWnd );
}

投稿日時 - 2009-01-08 18:45:30

お礼

返答遅れてすいません。
サンプル2でやっているのですが、画面更新は出来ているようなですが、画像のほうがちらっとしか出てきません。

投稿日時 - 2009-01-09 13:55:15

ANo.3

関数の戻り値(hbmpとか)はチェックしてみましたか?
あと、hdcの値が不明です。

投稿日時 - 2009-01-08 15:32:14

お礼

返答遅れてすいません。
チェックはしました、問題はないと思います。
>あと、hdcの値が不明です。
HDC hdc = BeginPaint(hWnd, &ps);
で初期化しています。

投稿日時 - 2009-01-09 13:05:44

ANo.2

「反映されない」というのは「書いてるはずなのに表示されない」という意味ですか?
でしたらUpdateWindow()で再描画イベント(WM_PAINT)を送信してやらなければならないような気がしますが。

投稿日時 - 2009-01-08 14:48:41

お礼

返信遅れてすいません。
WM_PAINT内は何を書いたらよいのですか?

投稿日時 - 2009-01-09 11:02:17

ANo.1

「何がわからないのか、何を聞きたいのか」が書かれていないので「わかりにくい」どころではなくさっぱりわかりません。

投稿日時 - 2009-01-08 14:01:37

お礼

申し訳ありません。
説明不足ですね。
ボタン内の処理が
HDC hMdc;
HBITMAP hbmp = (HBITMAP)LoadImage( NULL, dstLPCSTR3, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION );
hMdc= CreateCompatibleDC(hdc );
SelectObject(hMdc, hbmp );
BitBlt(hdc, 0, 0, 2000, 5000, hMdc, 0, 0, SRCCOPY);
DeleteDC(hMdc);
DeleteObject(hbmp);

なのですが、ボタン内の処理はこれだけが反映されないのです。
画面の更新?がなされていないのではと思いその方法はどのようなものが存在するのかを教えてもらいたいということです。
どうかお願いします。

投稿日時 - 2009-01-08 14:31:50

あわせてチェックしたい
  • ピクチャとHBITMAP ...
  • 文字列の連結について ...
  • ProfessionalとHome Edtion ...
PR

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら