1

事前に作成されたテンプレートリソースダイアログがあり、それを表示するために使用したいのですDialogBoxParamが、インターネット上で良い例を見つけることができません。ダイアログは単純なログインダイアログなので、誰かが私のビルド方法lpDialogFuncと何を入れるかを説明できdwInitParamますか?

4

3 に答える 3

9

この質問に C++ のタグを付けましたが、特定のフレームワーク (ATL や MFC など) を指定していません。

したがって、フレームワークを使用せずに、質問に対する c++ / OOP の回答を提供するという精神で、最初に行うことは、ダイアログ ボックスをラップするクラスを作成することと、ダイアログ プロシージャが確実に取得する方法を提供することです。クラスへのポインタ。thisWindows API は C API であり、クラス メンバーを直接呼び出すことができないため、どこかからクラス ポインターを取得できる静的メソッドを作成する必要があります。

class MyDialog {
  HWND _dlg;
public:
  int RunModal(HINSTANCE resModule, UINT resId,HWND parent){
    return DialogBoxParam(resModule,MAKEINTRESOURCE(resId),parent,&StaticDialogProc,(LPARAM)this);
  }
protected:
  static INT_PTR CALLBACK StaticDialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam){
    MyDialog* self;
    if(uMsg == WM_INITDIALOG){
      self = (MyDialog*)lParam;
      self->_dlg = hwndDlg;
      SetWindowLongPtr(hwndDlg,DWLP_USER,lParam);
    }
    else
      self = (MyDialog*)GetWindowLongPtr(hwndDlg,GWLP_USERDATA);

    if(self)
      return self->DialogProc(uMsg,wParam,lParam);

    return FALSE;
  }

  virtual UINT_PTR DialogProc(UINT uMsg,WPARAM wParam,LPARAM lParam){
    switch(uMsg){
    case WM_INITDIALOG:
      OnInitDialog();
      break;
    case WM_COMMAND:
      OnCommand(LOWORD(wParam),HIWORD(wParam),(HWND)lParam);
      break;
    default:
      return FALSE;
    }
    return TRUE;
  }

  virtual void OnInitDialog(){
  }
  virtual void OnCommand(int id, USHORT notifyCode,HWND control){
    EndDialog(_hdlg,id);
  }
};

現在、Windows がダイアログに送信できるウィンドウ メッセージは何百もあります。各メッセージのハンドラーを DialogProc に追加し、特定の仮想関数を呼び出して、派生クラスが仮想関数をオーバーライドすることでメッセージを異なる方法で処理できるようにします。

処理する重要なメッセージは、通常WM_INITDIALOG、ダイアログが作成されるとすぐに送信されるため、ダイアログのコントロールを初期化するのに理想的な時期です。ドロップダウン コントロールを設定するかSetWindowText、テキスト ボックスをデフォルト値で初期化します。WM_COMMAND は、ボタンなどのコントロールがクリックされたときに送信され、ID を渡します。ここで、[OK] ボタンと [CANCEL] ボタンを処理します。

DialogBoxParam が戻ると、ダイアログとそのすべての子コントロールが破棄されているため、通常は OnCommand ハンドラーですべての入力フィールドを抽出し、それらをクラス メンバーに格納してから を呼び出しEndDialogます。

于 2012-08-07T12:46:34.480 に答える
0

このようなことができます。dwInitParam WM_INITDIALOG メッセージの lParam パラメータで、ダイアログ ボックスに渡す値を指定します。任意の値を渡すか、単に NULL を渡すことができます

INT_PTR CALLBACK editDlg(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {

        switch (msg) {
            case WM_INITDIALOG:                  
                return 1;
            break;
        }
        return 0;
    }

if(DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_EDIT),hwndMain,editDlg,NULL)==IDOK) 
{
}
于 2012-08-07T09:52:33.833 に答える