事前に作成されたテンプレートリソースダイアログがあり、それを表示するために使用したいのですDialogBoxParam
が、インターネット上で良い例を見つけることができません。ダイアログは単純なログインダイアログなので、誰かが私のビルド方法lpDialogFunc
と何を入れるかを説明できdwInitParam
ますか?
3 に答える
この質問に C++ のタグを付けましたが、特定のフレームワーク (ATL や MFC など) を指定していません。
したがって、フレームワークを使用せずに、質問に対する c++ / OOP の回答を提供するという精神で、最初に行うことは、ダイアログ ボックスをラップするクラスを作成することと、ダイアログ プロシージャが確実に取得する方法を提供することです。クラスへのポインタ。this
Windows 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
ます。
このようなことができます。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)
{
}