Windows 使用GetSaveFileName。我指定了OFN_浏览器标志,但除非我避免同时使用钩子和模板,否则总是使用旧的对话框外观
使用GetSaveFileName。我指定了OFN_浏览器标志,但我总是使用旧的对话框外观,除非我避免同时使用钩子和模板。(OPENFILENAME结构中的lpfnHook和lpfnTemplate(及其各自的“启用”标志) 如果我避免只使用其中一个,我仍然会得到旧的对话框外观。我也尝试了没有模板,但使用挂钩。。。但是总是从它返回TRUE(我看到从钩子中提到“总是返回false”是获取旧接口的一种方式)。不过,这似乎没有任何效果 编辑:添加相关代码:Windows 使用GetSaveFileName。我指定了OFN_浏览器标志,但除非我避免同时使用钩子和模板,否则总是使用旧的对话框外观,windows,winapi,Windows,Winapi,使用GetSaveFileName。我指定了OFN_浏览器标志,但我总是使用旧的对话框外观,除非我避免同时使用钩子和模板。(OPENFILENAME结构中的lpfnHook和lpfnTemplate(及其各自的“启用”标志) 如果我避免只使用其中一个,我仍然会得到旧的对话框外观。我也尝试了没有模板,但使用挂钩。。。但是总是从它返回TRUE(我看到从钩子中提到“总是返回false”是获取旧接口的一种方式)。不过,这似乎没有任何效果 编辑:添加相关代码: ofn.lStructSize=sizeof
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>
}
ofn.lsstructsize=sizeof(OPENFILENAME);
ofn.hInstance=莱茵斯特;
of n.hwnowner=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;
如果n.lpstrInitialDir的(path&&lstrlen(path))为path;
else of n.lpstrInitialDir=驱动器;
lstrcpy(seu deext,ext);
ofn.lpstrDefExt=SE_deext;
if(titleid)of n.lpstrtite=标题;
else of n.lpstrtite=null;
ofn.lpfnHook=(CommHookProc)MakeProcInstance((FARPROC)SEOpen32Hook,hInst);
ofn.lpTemplateName=NULL;
ofn.Flags=ofn_SHOWHELP | ofn_OVERWRITEPROMPT | ofn_ENABLEHOOK | ofn_EXPLORER
|n|u路径必须存在,n|u路径必须隐藏;
如果(允许)
{
ofn.lpTemplateName=MAKEINTRESOURCE(SAVETOFIT);
ofn.Flags |=ofn_启用模板;
}
if(GetSaveFileName(&ofn))
{
//
}
请注意,在这种情况下,“allowfit”是非零/真的。如果我注释掉OFN_ENABLEHOOK和OFN_ENABLETEMPLATE的标志设置,就会得到“新建”对话框外观
**编辑2:现在看来我对我所看到的东西感到困惑。我相信在这两种情况下,我得到了“新”的N_探险家的行为和外观。当我删除OFN_EXPLORER标志时,会出现一个非常老式的对话框
我想了解的是“保存文件”对话框的样式,它在右上角有“后退”和“前进”按钮,最重要的是,还有一个我可以输入的地址框。我之前的所有评论和代码描述(以上)仍然适用;当我移除模板和钩子时,我会得到我的“后退和前进”按钮,以及我的可键入地址框(加上左侧的浏览树)。。。当我保留模板和钩子时——我没有(而是在顶部有“Save in”选取列表,在左侧有“standard places”(“最近的位置”、“桌面”和…)。也许您需要显示一些代码?根据MSDN: 您可以提供一个hook proc钩子 资源管理器样式保存的过程 对话框。要启用挂钩 过程中,设置OFN_资源管理器和 标志中的OFN_ENABLEHOOK标志 OPENFILENAME结构的成员 并指定钩子的地址 lpfnHook成员中的过程
因此,除非您正在做一些奇怪的事情,否则它应该会工作。至于模板,您应该定义DS_SHELLFONT。
您是否定义了
\u WIN32\u WINNT>=0x0500
?
将lStructSize设置为win2000大小可能有助于对话框做出决定(如果需要支持
OPENFILENAME\u size\u version\u 400
作为底层系统的大小)如果在Windows Vista和7中同时使用of n_EXPLORER
和of n_ENABLEHOOK
,您将获得XP风格的对话框。如果删除of n_EXPLORER
您将获得旧的Win2k风格。如果使用of n_ENABLEHOOK
(或of n_enablemplate
)然后系统将不使用Vista/7样式
由于Vista,如果您想自定义此类对话框,建议您使用COM接口IFileDialog
,IFileOpenDialog
,以及IFileSaveDialog
。请参见。参见上面的我的“编辑2”。看起来我不是在对抗“旧外观/新外观”正如OFN_EXPLORER设置的,我正在与一些浏览器/非浏览器行为和外观进行斗争。知道我可能需要做什么吗?遗憾的是,我不能只删除模板和挂钩;这些必须保留。