自定义Win32的“保存文件”对话框

时间:2009-09-15 19:45:44

标签: c++ winapi customization savefiledialog ofnhookproc

我正在尝试使用GetSaveFileName保存文件,并希望在我的保存文件对话框的底部有一些额外的弹出窗口,以允许用户指定更多选项。我正在尝试关注该主题的MSDN documentation(特别是Explorer-style customization),但似乎无法显示我的自定义项目。我相信我正在设置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。

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

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

如果您仍想在运行时创建控件,我猜您还必须调整父级的大小并将其放在WM_INITDIALOGCDN_INITDONE中(您的父级是主对话框内的空对话框) )使用WinSpy++之类的工具在运行时“调试”对话框

答案 2 :(得分:1)

将控件传递给OPENFILENAME结构的lpTemplateName参数中的单独对话框ressource模板。这非常简单可靠。它在您提到的链接中有描述,