gpt4 book ai didi

c++ - GetSaveFileName/IFileSaveDialog - 用户输入事件/对文件名更改使用react?

转载 作者:行者123 更新时间:2023-11-30 16:37:05 25 4
gpt4 key购买 nike

我目前正在使用GetSaveFileName我的 C++ 应用程序中的对话框。 (据我所知,这已被 IFileDialog interface 取代,我选择不将此问题限制为已弃用的 API,而是接受两种实现的解决方案)。

挑战在于对用户输入使用react(即用户手动键入文件名输入)并相应地修改文件对话框。

作为一个具体示例,请考虑当用户手动输入支持的文件扩展名时自动更改文件类型下拉列表中的文件类型。

<小时/>

我曾希望 OPENFILENAMElpfnHook 成员结构可以为我做到这一点,不幸的是,文件名输入中键入的字符似乎没有触发事件。

最佳答案

正确的解决方案是使用用户输入的任何文件名创建保存的文件,并根据所选过滤器格式化文件内容。在关闭对话框之前,用户应该可以根据需要自由更改过滤器。

无需对各个按键使用react。但是,如果您必须这样做,那么在使用旧版 GetSaveFileName() API 时,唯一的选择是直接对文件名编辑字段进行子类化,例如使用 SetWindowSubclass()。您可以使用 GetDlgItem()edt1cmb13 控件 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com