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);
}

我还从我OFNHookProcWM_INITDIALOG消息中返回 1,为其他所有内容返回 0。

在我试图让组合框显示在对话框中的所有尝试中,它都没有出现。我的代码中缺少什么以使组合框成为我的保存文件对话框自定义的一部分?

4

3 回答 3

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

通常,当您将控件添加到公共对话框时,这些新控件位于对话框模板中(作为资源或内存中)。这样windows就可以处理好位置。

如果您仍想在运行时创建控件,我猜您还必须调整父级的大小和位置,WM_INITDIALOG或者CDN_INITDONE(您的父级是主对话框内的一个空对话框)使用WinSpy++之类的工具来“调试”对话框运行

于 2009-09-15T23:05:20.663 回答
1

在 OPENFILENAME 结构的 lpTemplateName 参数中的单独对话框资源模板中传递您的控件。这非常简单可靠。它在您引用的链接中进行了描述,

于 2009-09-16T07:20:34.487 回答