none
親windowと子dialogの制御切替について RRS feed

  • 質問

  • (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でその続きの処理をする。
    なぜ、このような流れができませんか?
    2006年10月2日 4:26

回答

  • これは、親Window から子DialogBoxを呼び出した後、子DialogBoxが閉じるまで親Windowの処理を止めておきたいという話でよろしいでしょうか?

    そういう話でしたら、Modal DialogBox をキーワードにして help を参照してみて下さい。具体的には、DialogBox 関数ないし DialogBoxParam 関数です。

     

    2006年10月2日 5:38
  • 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 はだいたい上のような感じになると思います。

     

     

     

    2006年10月3日 3:07

すべての返信

  • これは、親Window から子DialogBoxを呼び出した後、子DialogBoxが閉じるまで親Windowの処理を止めておきたいという話でよろしいでしょうか?

    そういう話でしたら、Modal DialogBox をキーワードにして help を参照してみて下さい。具体的には、DialogBox 関数ないし DialogBoxParam 関数です。

     

    2006年10月2日 5:38
  • ご回答、ありがとうございます。

    dialogboxparam()を使って、期待する動きができましたが、dialogboxparam()の場合、
    dialogboxのハンドルがもらえませんでした。
    よって、dialogbox内のコントロール(例え、ComboBox)の制御ができなくなりました。

    dialogboxparam()を使った場合、dialogbox内のコントロールの制御は、どう実現するか?
    教えていただきたいです。
    2006年10月3日 1:18
  • 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 はだいたい上のような感じになると思います。

     

     

     

    2006年10月3日 3:07
  • 問題を解決しました。
    ご教示、ありがとうございます。
    2006年10月3日 6:14