使用 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 >= 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_EXPLORER
和 OFN_ENABLEHOOK
,您将获得 XP 样式的对话框。如果您删除OFN_EXPLORER
,您将获得较旧的 Win2k 样式。如果你使用OFN_ENABLEHOOK
(或OFN_ENABLETEMPLATE
)那么系统将不会使用Vista/7风格。
从 Vista 开始,如果您想自定义此类对话框,建议您使用 COM 接口 IFileDialog
、IFileOpenDialog
和 IFileSaveDialog
。见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() 返回的字符包含空字符