トップ回答者
親windowと子dialogの制御切替について

質問
-
(A)今のやり方
①親windowと子dialogの作成
hWnd = CreateWindowEx(,,,,,,,,,,hInstance,); //親window作成
hDlg = CreateDialog(hInstance,MAKEINTRESOURCE(),hWnd,lpDialogFunc); //子dialog作成
ShowWindow(hWnd,SW_SHOW); //親window表示
②親windowでのイベント処理(ボタンクリックのイベント)
...
ShowWindow(hDlg , SW_SHOW); //子dialog表示
SetActiveWindow(hDlg); //子dialogをActiveに設定する
... //そのたの続き処理
③子dialogのプロシージャで、本番処理後、親windowに制御権返す.
SetActiveWindow(hWnd);
ShowWindow(hDlg, SW_HIDE);
(B)問題
①制御件の切替できない。
親windowでイベント(ボタンクリック)を発生すると、子dialog表示と親windowの"そのたの処理"が同時に発生する。
目標は、子dialog呼び出し、子dialogの処理終了後、親windowでその続きの処理をする。
なぜ、このような流れができませんか?
回答
-
DialogBox 内のコントロールの Window Handle を DialogBox の Window Handle から得たいという理解でよろしいでしょうか?
DialogBox の Window Handle 自体は、(DialogBoxParam の第4引数 DLGPROC で与えた) DialogProc が呼び出された時、第1引数に与えられます。その Window Handle とコントロールの ID から GetDlgItem Function を使うことでコントロールの Window Handle が入手できます。(細かな部分はヘルプを参照して下さい。)
INT_PTR CALLBACK SomeDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_INITIDIALOG:
{
HWND hwndControl ;SetWindowLongPtr (hwndDlg, DWLP_USER, (LONG_PTR) lParam) ;
// SetWindowLong (hwndDlg, DWL_USER, (LONG) lParam) ;hwndControl = GetDlgItem (hwndDlg, IDC_SOMECONTROL) ;
/* .... コントロールの初期化など。*/
return (INT_PTR) 1 ;
}
case WM_COMMAND:
{
switch (LOWORD (wParam) {
case IDOK:
case IDCANCEL:
EndDialog (hwndDlg, LOWORD (wParam)) ;
break ;
default:
break ;
}
return (INT_PTR) 1 ;
}
default:
break ;
}
return (INT_PTR) 0 ;
}DialogProc はだいたい上のような感じになると思います。
すべての返信
-
DialogBox 内のコントロールの Window Handle を DialogBox の Window Handle から得たいという理解でよろしいでしょうか?
DialogBox の Window Handle 自体は、(DialogBoxParam の第4引数 DLGPROC で与えた) DialogProc が呼び出された時、第1引数に与えられます。その Window Handle とコントロールの ID から GetDlgItem Function を使うことでコントロールの Window Handle が入手できます。(細かな部分はヘルプを参照して下さい。)
INT_PTR CALLBACK SomeDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_INITIDIALOG:
{
HWND hwndControl ;SetWindowLongPtr (hwndDlg, DWLP_USER, (LONG_PTR) lParam) ;
// SetWindowLong (hwndDlg, DWL_USER, (LONG) lParam) ;hwndControl = GetDlgItem (hwndDlg, IDC_SOMECONTROL) ;
/* .... コントロールの初期化など。*/
return (INT_PTR) 1 ;
}
case WM_COMMAND:
{
switch (LOWORD (wParam) {
case IDOK:
case IDCANCEL:
EndDialog (hwndDlg, LOWORD (wParam)) ;
break ;
default:
break ;
}
return (INT_PTR) 1 ;
}
default:
break ;
}
return (INT_PTR) 0 ;
}DialogProc はだいたい上のような感じになると思います。