我正在尝试使用 GetSaveFileName 保存文件,并希望在我的保存文件对话框的底部有一些额外的弹出窗口,以允许用户指定更多选项。我正在尝试关注 MSDN文档(特别是资源管理器风格的自定义)关于主题但似乎无法让我的自定义项目出现。我相信我正确地设置了 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代替其他所有消息。

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

有帮助吗?

解决方案

调用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);

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top