BitBlt()とWM_CLOSEメッセージ
Posted: 2009年1月21日(水) 04:43
ただいまWin32APIを勉強中なのですが、ちょっと原因不明なことが起きましたので質問させていただきます。
とりあえずソースから。ウィンドウプロシージャ部分です。
WM_CLOSEメッセージでメッセージボックスを表示し、終了確認するようにしているのですが、どうもこの処理が原因のようで、コメントアウトしたところ正常に動作しました。
あと、いろいろやってみた結果、理由は良く分からないのですが、固まっている時にAltキーを押すとメッセージボックスが表示されました。
また、固まっているときにスペースキー、エンターキーでプログラムが終了したので、固まっているときもメッセージボックスは表示されているつもり(?)なようです。
ということで、この現象の起きる原因のわかる方は、どうかご教授願います。
とりあえずソースから。ウィンドウプロシージャ部分です。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
// ビットマップハンドル
static HBITMAP hBitmap, hPrevBitmap;
// デバイスコンテキストハンドル
static HDC hDC, hCompatDC;
switch(msg)
{
case WM_CREATE:
// ビットマップをファイルから読み込む
hBitmap = (HBITMAP)LoadImage(NULL, _T(".\\test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if(hBitmap == NULL)
{
MessageBox(hWnd, _T("読み込みエラー"), _T("警告"), MB_OK | MB_ICONWARNING);
break;
}
// ウィンドウのデバイスコンテキストハンドルを取得
hDC = GetDC(hWnd);
// メモリデバイスコンテキストを作成
hCompatDC = CreateCompatibleDC(hDC);
// ロードしたビットマップを選択
hPrevBitmap = (HBITMAP)SelectObject(hCompatDC, hBitmap);
break;
case WM_CLOSE:
if(MessageBox(hWnd, _T("終了しますか?"), _T("WM_CLOSE"), MB_YESNO | MB_ICONQUESTION) == IDYES)
{
// WM_DESTROYメッセージを送信
DestroyWindow(hWnd);
}
break;
case WM_DESTROY:
// 以前のビットマップに戻す
SelectObject(hCompatDC, hPrevBitmap);
// ロードしたビットマップを削除
DeleteObject(hBitmap);
// メモリデバイスコンテキストを削除
DeleteObject(hCompatDC);
// デバイスコンテキストハンドル削除
ReleaseDC(hWnd, hDC);
PostQuitMessage(0);
break;
case WM_PAINT:
// ビットマップをウィンドウに転送
BitBlt(hDC, 10, 10, 500, 500, hCompatDC, 0, 0, SRCCOPY);
break;
default:
return DefWindowProc(hWnd, msg, wp, lp);
}
return 0;
}
この結果画像は正常表示されて、上手くいったかのように思えたのですが、×ボタンを押すと固まってしまいます。WM_CLOSEメッセージでメッセージボックスを表示し、終了確認するようにしているのですが、どうもこの処理が原因のようで、コメントアウトしたところ正常に動作しました。
あと、いろいろやってみた結果、理由は良く分からないのですが、固まっている時にAltキーを押すとメッセージボックスが表示されました。
また、固まっているときにスペースキー、エンターキーでプログラムが終了したので、固まっているときもメッセージボックスは表示されているつもり(?)なようです。
ということで、この現象の起きる原因のわかる方は、どうかご教授願います。