2009-09-15 38 views
1

我想保存使用GetSaveFileName文件,并希望有我的保存文件对话框的底部一对额外的弹出窗口,以允许用户进一步指定选项。我试图按照关于这一主题的MSDN documentation(特别是Explorer-style customization),但似乎无法让我的自定义项目出现。我相信我正确设置了OPENFILENAME结构,因为我正在拨打我的电话OFNHookProc。据我所知,这是WM_INITDIALOG消息,我要创造我的子控件,这是我在做什么时:定制的Win32的保存文件对话框

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为一切。

在我所有的努力,以获得组合框在对话框中显示,这不是来了。我的代码中缺少什么来使组合框成为我的保存文件对话框定制的一部分?

+1

你为什么不只是使用自定义对话框模板也? – MSN 2009-09-15 22:41:23

回答

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

通常,当您添加控件到一个共同的对话,这些新的控件是在一个对话框模板(如资源或内存)。这样窗户照顾的位置。

如果你仍然想在运行时创建控件,我猜你也来调整和WM_INITDIALOGCDN_INITDONE父位置(你的家长是主对话框内的空对话)使用工具像WinSpy++到“调试”在运行时

1

对话框转至OPENFILENAME结构的lpTemplateName参数单独的对话框的ressource模板您的控件。这工作非常简单可靠。它在你refered的链接描述,