
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hW,UINT ms,WPARAM wp,LPARAM lp)
{
HDC hD;
PAINTSTRUCT ps;
static int width=0,height=0;
static TCHAR strSize[128];
static boolean b_logoff;
int i;
switch(ms)
{
case WM_QUERYENDSESSION:
b_logoff=true;
i=MessageBox(hW,"end?","?",MB_YESNO|MB_TOPMOST);
if(i==IDNO)b_logoff=false;
case WM_CLOSE:
case WM_DESTROY:
PostQuitMessage(0);
return b_logoff;
case WM_SIZE:
width=LOWORD(lp);
height=HIWORD(lp);
return b_logoff;
case WM_PAINT:
hD=BeginPaint(hW,&ps);
wsprintf(strSize,"width = %d : height= %d",width,height);
TextOut(hD,10,10,strSize,lstrlen(strSize));
EndPaint(hW,&ps);
return b_logoff;
}
return DefWindowProc(hW,ms,wp,lp);
}
ユーザがWindowsを終了させようとしたときに
ウォーンング用の警告ボックスを表示したのですが
Noボタンを押してもWindowsが終了してしまいます
何が悪いのでしょうか?
No.3ベストアンサー
- 回答日時:
>case WM_QUERYENDSESSION:
>のときも
>case WM_CLOSE:
>case WM_DESTROY:
>の後の処理を行わせる事にしているのです
なんで?
PostQuitMessage(0);
呼び出すから終わっちゃうんですけど。
そもそもWM_CLOSEでPostQuitMessage()呼ぶのもおかしいんですけど。
ありがとうございます
PostQuitMessage(0);
を使ったのはこれを使ってもメインウィンドウが壊されるとは限らないと書いていたからです
試行錯誤で何とかやってみます
No.4
- 回答日時:
>WM_QUERYENDSESSIONもWM_CLOSEもWM_DESTROYもWM_PAINTもみんな戻り値がおかしい。
この上の文章、なんか少し誤解されてるかも。
WM_PAINTもWM_CLOSEもWM_DESTROYもおかしいというのは、すべて常に0を返さないといけないからということです。
変数を使ってる時点で変です。
という意味で書いてます。LRESULTじゃないからということでは無いです。
No.2
- 回答日時:
WM_QUERYENDSESSIONもWM_CLOSEもWM_DESTROYもWM_PAINTもみんな戻り値がおかしい。
WM_QUERYENDSESSIONに対する処理は#1の方のとおりに構造がおかしい。
そもそもFALSEとfalseは別物だしウィンドウプロシージャの戻り値はLRESULT。boolじゃないし。
で、一番の原因はWM_QUERYENDSESSION中のメッセージボックスで「いいえ」を押されたときにプロシージャの戻り値でFALSEを返してないこと。
http://msdn.microsoft.com/library/default.asp?ur …
No.1
- 回答日時:
if(i==IDNO)b_logoff=false;
の後、break も return もありませんけど、それでいいのですか?
この回答への補足
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hW,UINT ms,WPARAM wp,LPARAM lp)
{
HDChD;
PAINTSTRUCTps;
static intwidth=0,height=0;
static TCHARstrSize[128];
static intlogoff;
inti;
logoff=0;
switch(ms)
{
case WM_QUERYENDSESSION:
logoff=1;;
i=MessageBox(hW,"end?","?",MB_YESNO|MB_TOPMOST);
if(i==IDNO)logoff=0;
case WM_CLOSE:
case WM_DESTROY:
PostQuitMessage(0);
return logoff;
case WM_SIZE:
width=LOWORD(lp);
height=HIWORD(lp);
return logoff;
case WM_PAINT:
hD=BeginPaint(hW,&ps);
wsprintf(strSize,"width = %d : height= %d",width,height);
TextOut(hD,10,10,strSize,lstrlen(strSize));
EndPaint(hW,&ps);
return logoff;
}
return DefWindowProc(hW,ms,wp,lp);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,PSTR,int)
{
HWNDhW;
MSGms;
WNDCLASSwinc;
winc.style=CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc=WndProc;
winc.cbClsExtra=winc.cbWndExtra=0;
winc.hInstance=hInstance;
winc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
winc.hCursor=LoadCursor(NULL,IDC_ARROW);
winc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName=NULL;
winc.lpszClassName=TEXT("KITTY");
if(!RegisterClass(&winc))return -1;
hW=CreateWindow
(
TEXT("KITTY"),TEXT("end test"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL
);
if(hW==NULL)return -1;
while(GetMessage(&ms,NULL,0,0))DispatchMessage(&ms);
return ms.wParam;
}
ありがとうございます
case WM_QUERYENDSESSION:
のときも
case WM_CLOSE:
case WM_DESTROY:
の後の処理を行わせる事にしているのです
一行抜けていました
あわせてWinMainも付けてみます
LRESULT CALLBACK WndProc(HWND hW,UINT ms,WPARAM wp,LPARAM lp)
{
HDC hD;
PAINTSTRUCT ps;
static int width=0,height=0;
static TCHAR strSize[128];
static boolean b_logoff;
int i;
b_logoff=false;
switch(ms)
{
case WM_QUERYENDSESSION:
b_logoff=true;
i=MessageBox(hW,"end?","?",MB_YESNO|MB_TOPMOST);
if(i==IDNO)b_logoff=false;
case WM_CLOSE:
case WM_DESTROY:
PostQuitMessage(0);
return b_logoff;
case WM_SIZE:
width=LOWORD(lp);
height=HIWORD(lp);
return b_logoff;
case WM_PAINT:
hD=BeginPaint(hW,&ps);
wsprintf(strSize,"width = %d : height= %d",width,height);
TextOut(hD,10,10,strSize,lstrlen(strSize));
EndPaint(hW,&ps);
return b_logoff;
}
return DefWindowProc(hW,ms,wp,lp);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,PSTR,int)
{
HWND hW;
MSG ms;
WNDCLASS winc;
winc.style=CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc=WndProc;
winc.cbClsExtra=winc.cbWndExtra=0;
winc.hInstance=hInstance;
winc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
winc.hCursor=LoadCursor(NULL,IDC_ARROW);
winc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName=NULL;
winc.lpszClassName=TEXT("KITTY");
if(!RegisterClass(&winc))return -1;
hW=CreateWindow
(
TEXT("KITTY"),TEXT("end test"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL
);
if(hW==NULL)return -1;
while(GetMessage(&ms,NULL,0,0))DispatchMessage(&ms);
return ms.wParam;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- Excel(エクセル) Excel2019 マクロを使用し画像を貼り付けした際のリンク切れについて 2 2022/11/15 16:14
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー Run-Time Check Failur...
-
MessageBoxについて
-
ダイアログプログラムでEnterキ...
-
キャレットの現在位置の表示 (W...
-
C++のcase文の書き方
-
C#のswitch文を簡略化したいの...
-
Win32のファイルダイアログのサ...
-
「Aに対するBの割合」と「Aに対...
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
エクセルで可視セルにのみ値貼...
-
Aの値からBの値を除するとは??
-
C言語での引数の省略方法
-
2÷3などの余りについて
-
fgetsなどのときのstdinのバッ...
-
#if 1 #elseの意味について
-
10個出力で改行したいのですが...
-
#define _CRT_SECURE_NO_WARNIN...
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ダイアログプログラムでEnterキ...
-
エラー Run-Time Check Failur...
-
プログラミングでエラーが出ま...
-
ボタンの色(WINAPI)
-
Win32APIでウィンドウを中央に...
-
C言語win32api、エディットボッ...
-
C#のswitch文を簡略化したいの...
-
ウィンドウ非表示に時に表示し...
-
不明なエラー
-
COMPORTマルチスレッドで例外発生
-
WM_CREATE について
-
コンソールアプリケーションの...
-
別関数に渡す変数のポインタが...
-
作成プログラムを常にアクティ...
-
DialogBox
-
【Windowsアプリ】ファイルのド...
-
オーバーレイみたいな処理がしたい
-
ボタンのアイコン表示
-
ウィンドウのサイズ変更について
おすすめ情報