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

Mr.*_*Boy 0 c++ winapi

我们的应用程序将其项目保存为一个充满东西的文件夹,包括实际的项目文件something.abc

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

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

Rem*_*eau 6

Win32 SHBrowseForFolder()IFileOpenDialogAPI都允许用户选择文件夹.

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

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

SHBrowseForFolder()

检查文件类型是否存在:

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

要么

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

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

IFileOpenDialog

检查文件类型是否存在:

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

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

或者,接收器可以实现OnFolderChange事件以直接启用/禁用对话框的OK按钮(IFileDialogCustomize::SetControlState()在这种情况下不起作用):

  • HWND通过查询对话框的IOleWindow接口,然后调用其GetWindow()方法来检索对话框.
  • 然后使用Win32 GetDlgItem()函数HWND使用标准IDOK控件ID 获取OK按钮.
  • 然后使用Win32 EnableWindow()功能启用/禁用按钮.