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

我正在尝试使用GetSaveFileName保存文件,并且希望在我的保存文件对话框的底部有几个额外的弹出窗口,以允许用户指定其他选项.我正在尝试在该主题上关注MSDN documentation(特别是Explorer-style customization),但似乎无法显示我的自定义项目.我相信在收到OFNHookProc的调用时,我已经正确设置了OPENFILENAME结构.据我所知,应该在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);
}

对于WM_INITDIALOG消息,我还从我的OFNHookProc返回1,其他所有返回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);
上一篇:VectorDraw常见问题整理:如何在OpenFileDialog和SaveFileDialog中


下一篇:C# – 在Listbox中保存值