代码之家  ›  专栏  ›  技术社区  ›  fbrereto

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

  •  1
  • fbrereto  · 技术社区  · 16 年前

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

    我也从我的 奥夫霍克普罗克 对于 wm初始化对话框 消息和0代表其他一切。

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

    3 回复  |  直到 16 年前
        1
  •  1
  •   Remy Lebeau    16 年前

    当调用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
  •  1
  •   Anders    16 年前

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

    如果您仍然想在运行时创建控件,我想您还需要调整父控件的大小并将其放置在 WM_INITDIALOG CDN_INITDONE (您的父级是主对话框中的空对话框)使用类似的工具 WinSpy++ 在运行时“调试”对话框

        3
  •  1
  •   RED SOFT ADAIR    16 年前

    在OpenFileName结构的lpTemplateName参数中的单独对话框资源模板中传递控件。这非常简单可靠。在你提到的链接中有描述,