GetSave文件名 / IFileSaveDialog - 用户输入的事件/对文件名更改做出反应?
GetSaveFileName / IFileSaveDialog - event on user input / react to file name change?
我目前正在C++应用程序中使用GetSave文件名对话框。(据我所知,这已被 IFileDialog 接口取代,我选择不将此问题限制为已弃用的 API,而是接受两种实现的解决方案)。
挑战在于对用户输入做出反应(即用户手动键入文件名输入)并相应地修改文件对话框。
作为具体示例,请考虑在用户手动输入支持的文件扩展名时自动更改文件类型下拉列表中的文件类型。
我曾希望 OPENFILENAME 结构的lpfnHook
成员可以为我做到这一点,不幸的是,文件名输入中似乎没有为键入的字符触发事件。
正确的解决方案是使用用户键入的任何文件名创建保存的文件,并根据所选筛选器设置文件内容的格式。在关闭对话框之前,用户应该可以根据需要自由更改筛选器。
无需对单个按键做出反应。但是,如果必须,那么在使用旧版GetSaveFileName()
API 时,唯一的选择是直接对文件名编辑字段进行子类化,例如使用SetWindowSubclass()
.可以使用具有edt1
或cmb13
控件 ID 的GetDlgItem()
获取编辑字段的HWND
。子类可以截获按键消息,然后向对话框发送CDM_GETFILEPATH
消息以获取当前键入的文件名,从中分析扩展名,并相应地手动更新筛选器组合框。可以使用具有cmb1
控件 ID 的GetDlgItem()
获取组合框的HWND
。
但是,在 Vista 及更高版本上,当使用 ComCtl32 v6 时,GetSaveFileName()
只是较新的IFileSaveDialog
API 的包装器,因此不能保证上述内容不再有效。但你可以尝试一下。
如果直接使用较新的IFileDialog
API,它确实允许您通过IFileDialogCustomize
使用新控件自定义对话框,但它不允许对现有控件进行子类化(它不提供对对话框或其控件的HWND
的访问。您必须求助于较低级别的钩子才能访问它们)。如果您确实设法对文件名编辑字段进行子类化,则可以使用IFileDialog::GetFileName()
来检索当前键入的文件名,但不能直接更新筛选器组合框,因为一旦显示对话框就无法调用IFileDialog::SetFilterTypeIndex()
(除非您能找到一种方法来获取其HWND
)。仅在 Vista 上,您可以尝试根本不指定过滤器(或者至少指定*.*
过滤器),然后结合使用IFileDialogCustomize::AddComboBox()
和IFileDialogControlEvents::OnItemSelected
来模拟手动过滤器列表,IFileDialog::SetFilter()
根据所选过滤器指定对话框中显示哪些项目。但是,SetFilter()
已被弃用,不再适用于 Windows 7 及更高版本。
- 从命令行c++发送文本文件名
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何创建事件驱动的 SDL2 应用程序
- GetSave文件名 / IFileSaveDialog - 用户输入的事件/对文件名更改做出反应?
- 如何在C++中获取文件更改事件的文件名
- 如何从QFileSystemWatcher“directoryChanged”事件中获取更改后的文件名