プロが教える店舗&オフィスのセキュリティ対策術

次のようなプログラムを作りました。

/*ウィンドウプロシージャ内*/
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キーを押すと表示されるのですが・・・
左クリックをするとすぐにメッセージボックスを表示させるにはどうしたらよいのでしょう?
言葉足らずの説明かもしれませんがお願いします。

A 回答 (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;

}
    • good
    • 0
この回答へのお礼

上記のプログラムは動きました。ちなみに私の環境は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をやると動くのですが、ウィンドウプロシージャー内でやると駄目になるのです。

お礼日時:2002/12/05 01:59

WM_PAINTでの描画にはBeginPaint/EndPaintを使うのがお約束のようです。

GetDCの代わりに使ってください。
    • good
    • 0
この回答へのお礼

ありがとうございました。
手元の本で読んだところ、
BeginPaintはWM_PAINTに対する描画処理が・・・って書いてありました。
ありがとうございました。

お礼日時:2002/12/08 01:16

おそらく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;
    • good
    • 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の扱い方自体に問題があるのでしょうか?

お礼日時:2002/12/06 22:54

こんばんわ。



自分の所で、試したらちゃんと出ましたよ。
でも、自分も同じ現象になった気がして気になりました。
breakじゃなくて、returnで値を返してみて、試してもらえないでしょうか?
hantei関数および呼び出しは、上記のでOKだと思います。
    • good
    • 0
この回答へのお礼

こんばんわ

return でも動きませんでした。上の方のお礼のところに
詳しくプログラムを載せるので見てもらえないでしょうか??
回答ありがとうございます。

お礼日時:2002/12/05 01:46

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