SDKにて作成しております初心者です。
メニューからダイアログボックスが出るようにしたのですが、OK、キャンセル、×ボタンいずれを押しても親ウィンドウごと消えてしまいます。
調べたところ、どうやらWM_CLOSEが出ているようでした。
何故こうなってしまうのか、もしくはこうならない方法を教えていただけませんでしょうか。よろしくお願いいたします。
ソースを見なければ何とも言えませんが、
ダイアログプロシージャは作りましたか?
メインであるウィンドウのプロシージャと供用しているような気がします。
http://www.kumei.ne.jp/c_lang/sdk/sdk_13.htm
しろおに。さんが(恐らく)意図する事がそっくりそのまま書かれているので
参考にしてはどうでしょう?
高名なサイトなのでもう参考にされたかもしれませんが (^^;
レスありがとうございます。
「猫でもわかる」を主に参考にしてダイアログプロシージャも作ってありましたが、解決できませんでした。
ソースのプロシージャの部分を省略して載せようと思います。
何卒よろしくお願いいたします。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){
RECT rc;
switch(msg){
case WM_CREATE: //エジットボックスを親に貼り付け
GetClientRect(hWnd, &rc);
hEdit = CreateWindow("EDIT",NULL,WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE |ES_AUTOVSCROLL | WS_HSCROLL | WS_VSCROLL,0,0,rc.right,rc.bottom,hWnd,(HMENU)ID_EDIT,hInst,NULL);
SendMessage(hEdit,EM_SETLIMITTEXT,(WPARAM)1024*64,0);
break;
case WM_SIZE:
GetClientRect(hWnd,&rc);
MoveWindow(hEdit,rc.left,rc.top,rc.right,rc.bottom,TRUE);
break;
case WM_COMMAND:
switch(wp){
case IDM_URL: //メニュー
DialogBox(hInst1,"URDIALOG",hWnd,(DLGPROC)MyDlgProc);
break;
default:
return(DefWindowProc(hWnd,msg,wp,lp));
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0L;
}
LRESULT CALLBACK MyDlgProc(HWND hDlogWnd, UINT msg, WPARAM wp, LPARAM lp){
switch(msg){
case WM_INITDIALOG:
SetWinCenter(hDlogWnd);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wp)){
case IDOK:
EndDialog(hDlogWnd,IDOK);
break;
case IDCANCEL:
EndDialog(hDlogWnd,IDCANCEL);
break;
default:
return FALSE;
}
default:
return FALSE;
}
return TRUE;
}
WndProc の
case WM_COMMAND:
に対する break; がありません。
よって、DialogBox から戻った後、すぐ下の
case WM_DESTOROY:
が実行されてしまいます。
MyDlgProc も同様、WM_COMMAND に対する break がありません。
(こちらは今回の問題とは関係ありませんが。)
わかりました。
ウインドウプロシージャ内のswitch 文の case WM_COMMAND: の最後にbreak;がないせいでそのような動作になっているものと思われます。
case WM_COMMAND:
switch(wp){
case IDM_URL: //メニュー
DialogBox(hInst1,"URDIALOG",hWnd,(DLGPROC)MyDlgProc);
break;
default:
return(DefWindowProc(hWnd,msg,wp,lp));
break;
}
break; //ここにbreak;が必要
case WM_DESTROY:
PostQuitMessage(0);
break;
この位置にbreak;がないとダイアログから制御が帰ってきたときにWM_COMMANDでbreakせずにそのままWM_DESTROY内の処理に行って、PostQuitMessageを実行してしまいます。
素早いレスをありがとうございます。
あ、本当だ!break;が抜けていますね。
ケアレスミスだったようです。
もう一度プロシージャ内の構成(書き方?)を再確認してみたいと思います。
単純なミスでも指摘してくださって本当にありがとうございました。
直接関係ないことですが,
ダイアログプロシージャの戻り値の型はINT_PTR (古くはBOOL)です。
キャストで誤魔化すよりも,正しい型を使って定義しましょう。
ツイート | ![]() |