使用 GetSaveFileName。我指定了 OFN_EXPLORER 标志,但总是得到旧的对话框外观,除非我避免同时使用钩子和模板

Posted

技术标签:

【中文标题】使用 GetSaveFileName。我指定了 OFN_EXPLORER 标志,但总是得到旧的对话框外观,除非我避免同时使用钩子和模板【英文标题】:Using GetSaveFileName. I specify OFN_EXPLORER flag, but always get old dialog appearance unless I avoid using both hook and template 【发布时间】:2009-03-02 20:08:20 【问题描述】:

使用 GetSaveFileName。我指定了 OFN_EXPLORER 标志,但我总是得到旧的对话框外观,除非我避免同时使用钩子和模板。 (OPENFILENAME 结构中的 lpfnHook 和 lpfnTemplate(以及它们各自的“启用”标志))

如果我避免只使用其中一种,我仍然会得到旧的对话框外观。我也尝试不使用模板,但使用钩子......但总是从中返回 TRUE(我看到从钩子中提到“总是返回 false”作为获取旧界面的一种方式)。不过好像没什么效果。

编辑:添加相关代码:

ofn.lStructSize=sizeof(OPENFILENAME);
ofn.hInstance=RhInst;
ofn.hwndOwner=MainWh;
ofn.lpstrFilter=s;
ofn.lpstrCustomFilter=null;
ofn.nMaxCustFilter=0;
ofn.nFilterIndex=sel;

ofn.lpstrFile=fname;
ofn.nMaxFile=lstrl;
ofn.lpstrFileTitle=tfile;
ofn.nMaxFileTitle=lstrl;

if (path && lstrlen(path)) ofn.lpstrInitialDir=path;
else ofn.lpstrInitialDir=drive;

lstrcpy(SE_DefExt,ext);
ofn.lpstrDefExt=SE_DefExt;
if (titleid) ofn.lpstrTitle=title;
else ofn.lpstrTitle=null;

ofn.lpfnHook=(CommHookProc)MakeProcInstance((FARPROC)SEOpen32Hook,hInst);
ofn.lpTemplateName=NULL;
ofn.Flags=OFN_SHOWHELP | OFN_OVERWRITEPROMPT | OFN_ENABLEHOOK  | OFN_EXPLORER
            | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;

if(allowfit)
    
    ofn.lpTemplateName = MAKEINTRESOURCE(SAVETOFIT);
    ofn.Flags |= OFN_ENABLETEMPLATE;
    

if (GetSaveFileName(&ofn))
    
    // <snip>
    

请注意,在这种情况下,“allowfit”是非零/真。如果我注释掉 OFN_ENABLEHOOK 和 OFN_ENABLETEMPLATE 的标志设置,我会看到“新”对话框外观。

**编辑 2: 现在看起来我对我所看到的感到困惑。我相信在这两种情况下,我都会得到“新的”OFN_EXPLORER 行为和外观。当我删除 OFN_EXPLORER 标志时,我得到一个非常老式的对话框。

我想要的是保存文件对话框的样式,该对话框的右上角有“后退”和“前进”按钮,以及(最重要的是)我可以输入的地址框。我以前的所有 cmets 和代码描述(上)仍然适用;当我删除模板和钩子时,我得到了我的“后退和前进”按钮,以及我的可键入地址框(加上左侧浏览树)......当我离开模板和钩子时——我没有(取而代之的是顶部有“保存在”选项列表,左侧有“标准位置”(“最近的位置”、“桌面”...)。

【问题讨论】:

【参考方案1】:

你定义_WIN32_WINNT &gt;= 0x0500了吗? 将 lStructSize 设置为 win2000 大小可能有助于对话框决定(如果您需要支持 OPENFILENAME_SIZE_VERSION_400 作为下级系统的大小)

【讨论】:

【参考方案2】:

也许您需要显示一些代码?根据 MSDN:

您可以提供一个 OFNHookProc 挂钩 Explorer风格的保存过程 对话框。启用挂钩 过程,设置 OFN_EXPLORER 和 Flags 中的 OFN_ENABLEHOOK 标志 OPENFILENAME 结构的成员 并指定钩子的地址 lpfnHook 成员中的过程。

所以看起来除非你做一些奇怪的事情,否则它应该可以工作。

【讨论】:

【参考方案3】:

至于模板,您应该定义 DS_SHELLFONT。 http://blogs.msdn.com/oldnewthing/archive/2005/02/04/366987.aspx

【讨论】:

见我上面的“编辑 2”。看起来我不是在与 OFN_EXPLORER 设置的“旧外观/新外观”作斗争,而是在与一些浏览器/非浏览器行为和外观作斗争。知道我可能需要做什么吗?可悲的是,我不能只删除我的模板和钩子;那些必须留下来。【参考方案4】:

如果您在 Windows Vista 和 7 中同时使用 OFN_EXPLOREROFN_ENABLEHOOK,您将获得 XP 样式的对话框。如果您删除OFN_EXPLORER,您将获得较旧的 Win2k 样式。如果你使用OFN_ENABLEHOOK(或OFN_ENABLETEMPLATE)那么系统将不会使用Vista/7风格。

从 Vista 开始,如果您想自定义此类对话框,建议您使用 COM 接口 IFileDialogIFileOpenDialogIFileSaveDialog。见http://msdn.microsoft.com/en-us/library/windows/desktop/bb776913(v=vs.85).aspx。

【讨论】:

以上是关于使用 GetSaveFileName。我指定了 OFN_EXPLORER 标志,但总是得到旧的对话框外观,除非我避免同时使用钩子和模板的主要内容,如果未能解决你的问题,请参考以下文章

使用 GetSaveFileName 创建 SaveFileDialog 时如何停止覆盖提示

如何在 MacOS 下使用 QFileDialog::getSaveFileName(...)

QFileDialog::getSaveFileName() 在文件对话框中点击保存后返回一个空字符串

C 从 GetSaveFileName() 返回的字符包含空字符

在 QFileDialog::getSaveFileName 中指定默认扩展名

如何在 Windows 上使用 GetSaveFileName 检测“另存为类型:”组合框何时更改?