【问题标题】:Customizing Win32's Save File Dialog自定义 Win32 的保存文件对话框
【发布时间】:2009-09-15 19:45:43
【问题描述】:

我正在尝试使用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);
}

我还从我的 OFNHookProc 返回 1 用于 WM_INITDIALOG 消息,0 用于其他所有内容。

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

【问题讨论】:

  • 你为什么不也使用自定义对话框模板?

标签: c++ winapi customization savefiledialog ofnhookproc


【解决方案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);

【讨论】:

    【解决方案2】:

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

    如果您仍想在运行时创建控件,我猜您还必须在 WM_INITDIALOGCDN_INITDONE 中调整父项的大小和位置(您的父项是主对话框中的一个空对话框)使用工具像 WinSpy++ 在运行时“调试”对话框

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多