我们的应用程序将其项目保存为一个充满东西的文件夹,包括实际的项目文件something.abc
加载项目时,我们必须进入项目文件夹并找到项目文件.我知道有文件夹选择操作系统对话框,但我只想让它工作,如果它可以看到文件夹中存在文件.
我确定我已经看到了这一点,但我不知道如何...我们正在使用Qt,但是对于Windows的答案或本机的Windows是受欢迎的.一件事是我想使用本机操作系统对话框,而不是从头开始构建我自己的对话框.
Win32 SHBrowseForFolder()
和IFileOpenDialog
API都允许用户选择文件夹.
这两个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()
功能启用/禁用按钮.