1

を使用してファイルを保存しようとしていますが、ファイルGetSaveFileNameの保存ダイアログの下部にいくつかの追加のポップアップを表示して、ユーザーがさらにオプションを指定できるようにしたいと考えています。この件に関してMSDN のドキュメント(特にExplorer スタイルのカスタマイズ)に従おうとしていますが、カスタム アイテムが表示されないようです。OPENFILENAMEへの呼び出しを取得しているため、構造体を適切にセットアップしたと思いOFNHookProcます。私の知る限りWM_INITDIALOG、サブコントロールを作成する必要があるのはメッセージの最中であり、これが私が行っていることです:

HWND settings_popup =
    ::CreateWindowExW(WS_EX_CLIENTEDGE | WS_EX_NOPARENTNOTIFY,
                      L"COMBOBOX",
                      L"Settings:",
                      WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,
                      10,
                      10,
                      150,
                      30,
                      dialog, // the window parameter from the OFNHookProc
                      NULL,
                      ::GetModuleHandle(NULL),
                      NULL);

if (settings_popup)
{
    HWND parent = ::GetParent(settings_popup); // for verification
    ::ShowWindow(settings_popup, SW_SHOW);
    ::EnableWindow(settings_popup, true);
}

OFNHookProcまた、メッセージの場合はmy から 1 を返し、それ以外の場合はWM_INITDIALOG0 を返します。

コンボボックスをダイアログに表示しようとしても、うまくいきません。コンボボックスをファイル保存ダイアログのカスタマイズの一部にするためにコードに欠けているものは何ですか?

4

3 に答える 3

1

OPENFILENAME構造体のlpTemplateNameパラメーターにある別のダイアログリソーステンプレートにコントロールを渡します。それは非常に簡単かつ確実に機能します。それはあなたが参照したリンクで説明されています、

于 2009-09-16T07:20:34.487 に答える
1

CreateWindowEx() を呼び出して子ウィンドウを作成する場合、GetParent() を使用してダイアログの親ウィンドウを取得し、その HWND を親ウィンドウとして使用する必要があります。ダイアログ自体を親として使用しないでください。言い換えると:

HWND settings_popup =
    ::CreateWindowExW(WS_EX_CLIENTEDGE | WS_EX_NOPARENTNOTIFY,
                      L"COMBOBOX",
                      L"Settings:",
                      WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,
                      10,
                      10,
                      150,
                      30,
                      ::GetParent(dialog),
                      NULL,
                      ::GetModuleHandle(NULL),
                      NULL);
于 2009-09-15T22:46:22.837 に答える
1

通常、コントロールをコモン ダイアログに追加すると、それらの新しいコントロールはダイアログ テンプレートに (リソースとして、またはメモリ内に) 配置されます。このようにして、ウィンドウは位置を処理します。

それでも実行時にコントロールを作成したい場合は、親のサイズを変更して配置する必要があると思いますWM_INITDIALOGまたはCDN_INITDONE(親はメインダイアログ内の空のダイアログです) WinSpy++のようなツールを使用してダイアログを「デバッグ」しますランタイム

于 2009-09-15T23:05:20.663 に答える