使用文件对话框选择包含特定文件类型的文件夹?

时间:2018-05-24 14:56:04

标签: c++ winapi

我们的应用程序将其项目保存为一个包含实际项目文件something.abc

的文件夹

在加载项目时,我们必须进入项目文件夹并找到项目文件。我知道有文件夹选择操作系统对话框但我只想让它工作,如果它可以看到文件夹中存在文件。

我确定我已经看到了这一点,但我不知道我们是如何使用Qt的,但是对于Windows或者本机的Windows的答案是受欢迎的。一件事是我想使用本机操作系统对话框,而不是从头开始构建我自己的对话框。

1 个答案:

答案 0 :(得分:6)

Win32 SHBrowseForFolder()IFileOpenDialog API都允许用户选择文件夹。

这两个API都允许您对对话事件做出反应,例如当前文件夹选择的更改,当前选择的验证等。SHBrowseForFolder()具有回调函数,IFileOpenDialog具有{{1接收器接口。

这样的回调/接收器可以检查当前选择的文件夹是否具有给定的文件类型,然后阻止或允许对话框将该结果返回给调用者。

IFileDialogEvents

检查文件类型是否存在:

  • 通过将其绝对PIDL传递给SHBrowseForFolder()来获取文件夹的文件系统路径。
  • 然后使用SHGetPathFromIDList()使用所需的文件名模式掩码搜索该路径。

  • 通过将文件夹的绝对PIDL传递给FindFirstFile()来检索IShellFolder界面(或者,在Vista之前的系统上,使用SHBindToObject()获取SHGetDesktopFolder()顶级Desktop shell命名空间,然后将PIDL传递给其IShellFolder方法。
  • 然后使用BindToObject()方法获取其IShellFolder::EnumObjects()接口。
  • 然后使用父文件夹的IEnumIDList方法枚举文件的相对PIDL,以查找与所需文件名模式匹配的文件。

要阻止或允许对话框将成功返回给调用者,回调函数可以处理IShellFolder::GetDisplayNameOf()通知以根据需要验证文件夹,然后向对话框窗口发送BFFM_SELCHANGED消息{ {1}}相应地设置为零或非零。

BFFM_ENABLEOK

检查文件类型是否存在:

  • 使用文件夹的lParam方法检索其IFileOpenDialog界面。
  • 然后枚举文件的IShellItem::BindToHandler()接口,使用IEnumShellItems方法查找与所需文件名模式匹配的文件。

要阻止或允许对话框将成功返回给调用者,接收器可以实现IShellItem事件以验证所选文件夹并根据需要返回IShellItem::GetDisplayName()OnFileOk

或者,接收器可以实现S_OK事件以直接启用/禁用对话框的确定​​按钮(S_FALSE在这种情况下不起作用):

  • 通过查询其OnFolderChange界面的对话框,然后调用其IFileDialogCustomize::SetControlState()方法来检索对话框的HWND
  • 然后使用Win32 IOleWindow函数使用标准GetWindow()控件ID获取OK按钮的GetDlgItem()
  • 然后使用Win32 HWND函数启用/禁用按钮。