我们的应用程序将其项目保存为一个充满东西的文件夹,包括实际的项目文件something.abc
加载项目时,我们必须进入项目文件夹并找到项目文件.我知道有文件夹选择操作系统对话框,但我只想让它工作,如果它可以看到文件夹中存在文件.
我确定我已经看到了这一点,但我不知道如何...我们正在使用Qt,但是对于Windows的答案或本机的Windows是受欢迎的.一件事是我想使用本机操作系统对话框,而不是从头开始构建我自己的对话框.
Win32 SHBrowseForFolder()和IFileOpenDialogAPI都允许用户选择文件夹.
这两个API都允许您对对话事件做出反应,例如当前文件夹选择的更改,当前选择的验证等. SHBrowseForFolder()具有回调函数,并IFileOpenDialog具有接收IFileDialogEvents器接口.
这样的回调/接收器可以检查当前选择的文件夹是否具有给定的文件类型,然后阻止或允许对话框将该结果返回给调用者.
SHBrowseForFolder()检查文件类型是否存在:
SHGetPathFromIDList().FindFirstFile()所需的文件名模式掩码搜索该路径.要么
IShellFolder通过将文件夹的绝对PIDL传递给SHBindToObject()(或者在Vista之前的系统上,用于SHGetDesktopFolder()获取IShellFolder顶级Desktop shell命名空间,然后将PIDL传递给其BindToObject()方法)来检索接口.IShellFolder::EnumObjects()方法获取其IEnumIDList接口.IShellFolder::GetDisplayNameOf()方法查找与所需文件名模式匹配的文件.要阻止或允许对话框将成功返回给调用者,回调函数可以BFFM_SELCHANGED根据需要处理通知以验证文件夹,然后相应地向对话框窗口BFFM_ENABLEOK发送lParam设置为零或非零的消息.
IFileOpenDialog检查文件类型是否存在:
IShellItem::BindToHandler()方法来检索其IEnumShellItems界面.IShellItem文件的接口,使用该IShellItem::GetDisplayName()方法查找与所需文件名模式匹配的文件.要阻止或允许对话框将成功返回给调用者,接收器可以实现OnFileOk事件以验证所选文件夹并返回S_OK或S_FALSE根据需要返回.
或者,接收器可以实现OnFolderChange事件以直接启用/禁用对话框的OK按钮(IFileDialogCustomize::SetControlState()在这种情况下不起作用):
HWND通过查询对话框的IOleWindow接口,然后调用其GetWindow()方法来检索对话框.GetDlgItem()函数HWND使用标准IDOK控件ID 获取OK按钮.EnableWindow()功能启用/禁用按钮.