2012-11-18 27 views
1

我知道微软建议使用通过GetOpenFileName()GetSaveFileName()共同项目对话框,但我正在使用一些旧代码。极限目录与GetOpenFileName()

我怎样才能限制GetOpenFileName()只允许用户选择某个目录中的文件?

例如,我只希望用户能够从“Images”目录中选择一个文件。我不希望他们在打开文件时能够导航到其他目录。他们必须从“图像”目录中选择一个文件。

国旗OFN_NOCHANGEDIR听起来像它可能是我需要的,但只是当用户在打开文件时更改当前目录回原始目录。

如果GetOpenFileName()不可能,使用较新的Common Item对话框可以吗?

+0

你想要什么限制?用户至少可以将他想要打开的文件复制到您的目录 – Lol4t0

+0

@ Lol4t0:我已经看到应用程序这样做,以确保所有项目文件都在一个目录中。是的,你可以复制到目录中,但这就是要点。一切都在一个容易找到的地方。 –

回答

2

对于GetOpenFileName()GetSaveFileName(),您可以将回调过程分配给OPENFILENAME::lpfnHook字段。当它收到CDN_FILEOK通知时,通过发送对话框CDM_GETFOLDERPATH消息来检索选定的文件夹。如果该文件夹不可接受,请向用户显示一条消息,然后通过调用SetWindowLong()来拒绝所选文件以设置非零值DWL_MSGRESULT,并从挂钩过程返回一个非零值。

更新:为IFileOpenDialogIFileSaveDialog,您可以实现IFileDialogEvents::OnFolderChanging事件回调,以防止导航不需要的文件夹,通过返回比S_OKE_NOTIMPL其他错误HRESULT值。

+0

看起来像没有内置功能来做到这一点,并需要自己手动处理它。谢谢你的提示。 – user974967