
次のようなプログラムを作りました。
/*ウィンドウプロシージャ内*/
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キーを押すと表示されるのですが・・・
左クリックをするとすぐにメッセージボックスを表示させるにはどうしたらよいのでしょう?
言葉足らずの説明かもしれませんがお願いします。
No.2ベストアンサー
- 回答日時:
質問を見る限りでは特に問題はなさそうです。
もしかしたら、他の部分の問題かもしれません。下のプログラムではどうですか? 私の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;
}
上記のプログラムは動きました。ちなみに私の環境は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をやると動くのですが、ウィンドウプロシージャー内でやると駄目になるのです。
No.4
- 回答日時:
WM_PAINTでの描画にはBeginPaint/EndPaintを使うのがお約束のようです。
GetDCの代わりに使ってください。ありがとうございました。
手元の本で読んだところ、
BeginPaintはWM_PAINTに対する描画処理が・・・って書いてありました。
ありがとうございました。
No.3
- 回答日時:
おそらく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の扱い方自体に問題があるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) エクセルのマクロについて教えてください マクロを実行すると メッセージボックスが表示されて okをク 4 2023/07/05 19:32
- Windows 10 Google日本語入力について 3 2022/10/20 15:51
- Excel(エクセル) MSさん、シッカリしてよ~んッ! 3 2023/01/30 13:15
- その他(Microsoft Office) windows10で作業を終了する際の「保存しますか はい いいえ」を表示させずに自動で保存する方法 6 2023/03/15 11:29
- オープンソース AWSドメイン名でApacheテスト・ページを表示させる方法を教えて下さい。 1 2023/04/26 15:59
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- Windows 10 エクスプローラで希望の場所が表示できない 2 2023/06/29 15:19
- Excel(エクセル) excelvbaでスライドショーを作りたい 2 2023/04/20 14:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エディットボックスの背景の色...
-
プログラミングでエラーが出ま...
-
WM_KEYDOWNでPrtScを捕まえる方...
-
C#のswitch文を簡略化したいの...
-
LoadImageを使用し、タイトルバ...
-
WM_INITDIALOGのフック
-
Enterキーを押されたら次の処理...
-
「Aに対するBの割合」と「Aに対...
-
C言語での引数の省略方法
-
Aの値からBの値を除するとは??
-
「指定されたキャストは有効で...
-
DWORDの実際の型は何でしょうか
-
エクセルで可視セルにのみ値貼...
-
複数桁10進数の*桁目だけを抽出...
-
2÷3などの余りについて
-
fgetsなどのときのstdinのバッ...
-
(int *)の意味
-
数字以外が入力されたらエラー...
-
scanf が無視されます
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ダイアログプログラムでEnterキ...
-
エラー Run-Time Check Failur...
-
プログラミングでエラーが出ま...
-
ボタンの色(WINAPI)
-
Win32APIでウィンドウを中央に...
-
C言語win32api、エディットボッ...
-
C#のswitch文を簡略化したいの...
-
ウィンドウ非表示に時に表示し...
-
不明なエラー
-
COMPORTマルチスレッドで例外発生
-
WM_CREATE について
-
コンソールアプリケーションの...
-
別関数に渡す変数のポインタが...
-
作成プログラムを常にアクティ...
-
DialogBox
-
【Windowsアプリ】ファイルのド...
-
オーバーレイみたいな処理がしたい
-
ボタンのアイコン表示
-
ウィンドウのサイズ変更について
おすすめ情報