とりあえずソースから。ウィンドウプロシージャ部分です。
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キーを押すとメッセージボックスが表示されました。
また、固まっているときにスペースキー、エンターキーでプログラムが終了したので、固まっているときもメッセージボックスは表示されているつもり(?)なようです。
ということで、この現象の起きる原因のわかる方は、どうかご教授願います。