- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用GetSaveFileName我的 C++ 应用程序中的对话框。 (据我所知,这已被 IFileDialog interface 取代,我选择不将此问题限制为已弃用的 API,而是接受两种实现的解决方案)。
挑战在于对用户输入使用react(即用户手动键入文件名输入)并相应地修改文件对话框。
作为一个具体示例,请考虑当用户手动输入支持的文件扩展名时自动更改文件类型下拉列表中的文件类型。
<小时/>我曾希望 OPENFILENAME 的 lpfnHook
成员结构可以为我做到这一点,不幸的是,文件名输入中键入的字符似乎没有触发事件。
最佳答案
正确的解决方案是使用用户输入的任何文件名创建保存的文件,并根据所选过滤器格式化文件内容。在关闭对话框之前,用户应该可以根据需要自由更改过滤器。
无需对各个按键使用react。但是,如果您必须这样做,那么在使用旧版 GetSaveFileName()
API 时,唯一的选择是直接对文件名编辑字段进行子类化,例如使用 SetWindowSubclass()
。您可以使用 GetDlgItem()
和 edt1
或 cmb13
控件 ID 获取编辑字段的 HWND
。子类可以拦截按键消息,然后向对话框发送CDM_GETFILEPATH
消息以获取当前键入的文件名,从中解析扩展名,并相应地手动更新过滤器组合框。您可以使用 GetDlgItem()
和 cmb1
控件 ID 获取组合框的 HWND
。
但是,在 Vista 及更高版本上,当使用 ComCtl32 v6 时,GetSaveFileName()
只是较新的 IFileSaveDialog
API 的包装器,因此不能保证上述内容有效不再了。不过你可以尝试一下。
如果您直接使用较新的 IFileDialog
API,它确实允许您通过 IFileDialogCustomize
使用新控件自定义对话框,但它不允许您对现有控件进行子类化(它不提供对对话框或其控件的 HWND
的访问。您必须借助较低级别的 Hook 来访问它们)。如果您确实设法对文件名编辑字段进行子类化,则可以使用 IFileDialog::GetFileName() 来检索当前输入的文件名,但无法直接更新过滤器组合框,如 一旦对话框显示,就无法调用 IFileDialog::SetFilterTypeIndex()
(除非您能找到获取其 HWND
的方法)。仅在 Vista 上,您可以尝试根本不指定过滤器(或者至少指定 *.*
过滤器),然后使用 IFileDialogCustomize::AddComboBox()
和 IFileDialogControlEvents::OnItemSelected
来模拟手动筛选器列表,以及 IFileDialog::SetFilter()
来根据所选筛选器指定对话框中显示的项目。但是,SetFilter()
已弃用,并且不再适用于 Windows 7 及更高版本。
关于c++ - GetSaveFileName/IFileSaveDialog - 用户输入事件/对文件名更改使用react?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48128013/
我写了一个TOpenPictDialog(源代码见下文)组件,在某些情况下调用时最终失败 结果 := TDialogFunc(DialogFunc)(DialogData); 在 Dialogs.pa
你好,我正在尝试将默认目录添加到我的保存文件对话框中。 如何将它添加到此代码中: self._saveFilePath = QtGui.QFileDialog.getSaveFileName(self
我目前正在使用GetSaveFileName我的 C++ 应用程序中的对话框。 (据我所知,这已被 IFileDialog interface 取代,我选择不将此问题限制为已弃用的 API,而是接受两
在 Win32 函数 GetSaveFileName 中是否有等同于 OPENFILENAME 结构的 lpstrDefExt 成员? 这是来自 MSDN 的描述: LPCTSTR lpstrDefE
我正在使用以下代码来获取要保存的文件路径,以便与 tinyxml2 一起使用: OPENFILENAME ofn; char szFileName[MAX_PATH] = ""; ZeroMemory
我有 getSaveFileName 和一些过滤器,我希望在用户打开“保存”对话框时选择其中之一。 Qt 文档说明如下: The default filter can be chosen by set
我有以下代码(摘录)来显示“另存为”对话框: char FileName[MAX_PATH] = "TestImage.jpg" ... lpofn.lStructSize = sizeof(OPEN
在我的 PyQt4 应用程序中,有一项功能允许用户保存 avi 文件。为此,在主窗口中实现了一个 saveMovie 方法: def saveMovie(self): """ Let the
我正在尝试使用 GetSaveFileName 将一些字符串存储在一个 txt 文件中。该函数使用结构 OpenFileName。我已经彻底查看了 http://msdn.microsoft.com/
我想停止使用 Windows API 方法调用在 SaveFileDialog 弹出文件替换对话框。我只是想这样做,因为我用用户给定的文件名创建了一个新文件夹,因此另一个同名文件的存在不是问题....
我有一个调用 GetOpenFileNameA 和 GetSaveFileNameA 的旧应用程序。两次调用都是错误的。应用程序崩溃!我已经使用 OllyDbg 和 API Monitor 来读取存储
我写这段代码来获取文件名来保存我的文件: #include "stdafx.h" #include int _tmain(int argc, _TCHAR* argv[]) {
我有一个同时使用 SHBrowseForFolder 和 GetSaveFileName 的程序。 当我使用 GetSaveFileName 并且所选目录没有正确的权限时,它会自动显示错误,指出当前用
我有一个功能,可以将文件保存到用户指定的位置。我正在使用 GetSaveFileName() 来显示另存为对话框。然后我使用它返回的路径将文件写出到该位置。我注意到当用户在 XP 机器上选择 CD-R
我正在使用 GetSaveFileName Windows 应用程序中的“另存为”对话框。我想捕捉“保存类型:”组合框何时更改并获取其当前索引,但我不确定如何做。 使用我自己添加的组合框,我可以在我们
我正在维护一个使用 Win32 的 C++ 程序。它多年来一直运行良好,但现在我在两台运行 Windows 8 的计算机上遇到“选择文件”或“选择文件夹”功能的问题,但在另外两台运行 Windows
使用 GetSaveFileName。我指定了 OFN_EXPLORER 标志,但我总是得到旧的对话框外观,除非我避免同时使用 Hook 和模板。 (OPENFILENAME 结构中的 lpfnHoo
我是一名优秀的程序员,十分优秀!