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