【问题标题】:limit directory with GetOpenFileName()使用 GetOpenFileName() 限制目录
【发布时间】:2012-11-18 19:21:08
【问题描述】:

我知道 Microsoft 建议在 GetOpenFileName()GetSaveFileName() 上使用通用项对话框,但我正在使用一些旧代码。

如何限制GetOpenFileName() 只允许用户选择某个目录中的文件?

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

标志 OFN_NOCHANGEDIR 听起来可能是我需要的,但如果用户在打开文件时更改了当前目录,它只会将当前目录更改回原始目录。

如果 GetOpenFileName() 无法实现,那么新的 Common Item Dialog 是否可以实现?

【问题讨论】:

  • 你想要什么限制?用户至少可以将他想要打开的文件复制到您的目录中
  • @Lol4t0:我见过应用程序这样做是为了确保所有项目文件都在一个目录中。是的,您可以复制到目录中,但这就是重点。一切尽在一处,便于查找。

标签: c++ visual-studio-2010 winapi


【解决方案1】:

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

更新:对于IFileOpenDialogIFileSaveDialog,您可以实现IFileDialogEvents::OnFolderChanging 事件回调以防止导航到不需要的文件夹,只需返回一个错误HRESULT 值而不是@987654335 @ 或E_NOTIMPL

【讨论】:

  • 看起来没有内置功能可以做到这一点,需要自己手动处理。感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多