- ベストアンサー
MessageBoxについて
次のようなプログラムを作りました。 /*ウィンドウプロシージャ内*/ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ ・・・ case WM_LBUTTONDOWN: hantei(hWnd); break; ・・・ } /* 判定関数 */ void hantei(HWND hWnd){ MessageBox(hWnd,"テスト","テストです。",MB_OK); } このようになって動かしてみた(左クリックした)ところ、 ウィンドウ自体は非アクティブになったのですが、 BEEP音が鳴るだけで肝心のメッセージボックスが表示されません。 ALTキーを押すと表示されるのですが・・・ 左クリックをするとすぐにメッセージボックスを表示させるにはどうしたらよいのでしょう? 言葉足らずの説明かもしれませんがお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
質問を見る限りでは特に問題はなさそうです。もしかしたら、他の部分の問題かもしれません。下のプログラムではどうですか? 私のBCC5.5&WIN98SEでは表示されました。 ------------------------------------------------------------------------------------- #include<windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void hantei(HWND hWnd); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hWnd; MSG msg; WNDCLASS winc; winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = WndProc; winc.cbClsExtra = 0; winc.cbWndExtra = 0; winc.hInstance = hInstance; winc.hIcon = LoadIcon(NULL, IDC_ARROW); winc.hCursor = LoadCursor(NULL, IDC_APPSTARTING); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = "test"; if (!RegisterClass(&winc)) return 0; hWnd = CreateWindow( "test", "", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 300, 300, NULL, NULL, hInstance, NULL ); if (hWnd == NULL) return 0; while (GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); } return msg.wParam; } /*ウィンドウプロシージャ内*/ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_LBUTTONDOWN: hantei(hWnd); return 0; case WM_CLOSE: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } } /* 判定関数 */ void hantei (HWND hWnd) { MessageBox(hWnd, "テスト", "テストです。", MB_OK); return; }
その他の回答 (3)
- gimmick
- ベストアンサー率49% (134/270)
WM_PAINTでの描画にはBeginPaint/EndPaintを使うのがお約束のようです。GetDCの代わりに使ってください。
お礼
ありがとうございました。 手元の本で読んだところ、 BeginPaintはWM_PAINTに対する描画処理が・・・って書いてありました。 ありがとうございました。
- gimmick
- ベストアンサー率49% (134/270)
おそらくWM_PAINTの処理に問題があるのだと思います。 WM_PAINTの部分をコメントアウトしてデフォルトウィンドウプロシージャまかせにした場合はどうなりますか? また、次のようなコードにするとどうなりますか? case WM_PAINT: HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd , &ps); TextOut(hdc, 10, 10, "WM_PAINT", lstrlen("WM_PAINT")); EndPaint(hWnd , &ps); return 0;
お礼
回答ありがとうございます。 WM_PAINTをコメントアウトしたら動きました。さらに、上記のプログラムでも同様に動きました。 私のa.showでは HBITMAP hBitmapPrev; HDC hDC,hDCCompat; hDC = GetDC(hWnd); hDCCompat = CreateCompatibleDC(hDC); hBitmapPrev = (HBITMAP)SelectObject(hDCCompat, hBitmap); BitBlt(hDC, place.x*32, place.y*32, 32, 32,hDCCompat, 0, 0, SRCCOPY); SelectObject(hDCCompat, hBitmapPrev); DeleteObject(hBitmapPrev); DeleteDC(hDCCompat); ReleaseDC(hWnd, hDC); みたいなことをやってるのですが、ここが問題なんでしょうか?それとも、 WM_PAINTの扱い方自体に問題があるのでしょうか?
- rewind
- ベストアンサー率18% (11/59)
こんばんわ。 自分の所で、試したらちゃんと出ましたよ。 でも、自分も同じ現象になった気がして気になりました。 breakじゃなくて、returnで値を返してみて、試してもらえないでしょうか? hantei関数および呼び出しは、上記のでOKだと思います。
お礼
こんばんわ return でも動きませんでした。上の方のお礼のところに 詳しくプログラムを載せるので見てもらえないでしょうか?? 回答ありがとうございます。
お礼
上記のプログラムは動きました。ちなみに私の環境はwindowsXP visualC.netです。私の拙いプログラムを詳しく載せるので見ていただけると幸いです。ちなみにこれはいわゆる25パズルのプログラムです。 game a; void game::hantei(HWND hWnd){ int result=0; for(int i=0;i<25;i++){ if(num[i]->place.x==(int)i%5) if(num[i]->place.y==(int)i/5) result++; } if(result==25)MessageBox(hWnd,"ゲームクリア!!!","おめでとう",MB_OK); } int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, LPSTR lpCmdLine, int nCmdShow) { MSG msg; WNDCLASSEX wc; HWND hWnd; HMENU Menu; g_hInst=hInst; Menu=LoadMenu(g_hInst,MAKEINTRESOURCE(IDR_MENU1)); a.syokika(); ZeroMemory(&wc, sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; wc.hInstance = g_hInst; wc.hCursor= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = MYWNDCLASS; RegisterClassEx(&wc); hWnd = CreateWindowEx(0, MYWNDCLASS, NULL, WS_OVERLAPPEDWINDOW, 400,200, 32*7, 32*7, NULL, NULL, g_hInst, NULL); SetMenu(hWnd,Menu); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: a.show(hWnd); return 0; case WM_LBUTTONDOWN: a.idou(LOWORD(lParam),HIWORD(lParam)); a.hantei(hWnd); return 0; case WM_RBUTTONDOWN://ここはバグ発見用 MessageBox(NULL," ゲームクリア!!!","おめでとう",MB_OK); return 0; case WM_COMMAND: if(LOWORD(wParam)==ID_114)a.urawaza(); return 0; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } 長くなってすいません。これで、左クリック及び右クリックをしても メッセージボックスが表示されないのです。音はするから作られてはいるのだと思いますが・・・。 あと、winmain関数内でMessageBoxをやると動くのですが、ウィンドウプロシージャー内でやると駄目になるのです。