【问题标题】:IFileDialog Overwrite File and Open Folder/FileIFileDialog 覆盖文件并打开文件夹/文件
【发布时间】:2020-11-12 11:07:51
【问题描述】:

我有两个与IFileSaveDialogIFileOpenDialog 相关的问题,我没有找到解决方案,希望您能帮助我。

  1. 当用户使用现有名称保存文件时,会出现“确认另存为”提示。我需要将“是”选项标记为默认选项,而不是“否”。

  1. 用户可以从同一个对话框打开/加载文件或文件夹。

这些可以用这个 API 完成吗?或者其他 API?

我尝试用谷歌搜索它并查看 Microsoft 文档以找到解决方案,但没有成功。

【问题讨论】:

  • 1) 我认为没有官方选项,因为这显然是标准 UI 建议,默认设置为“否”。无论如何都找不到它 2)您可以使用 IFileDialog::SetOptions(...FOS_PICKFOLDERS ...) 但您只有文件夹。没有可以选择文件夹和文件的通用对话框,只能选择文件夹或文件。
  • 对于1)你可以使用IFileDialogEvents::OnOverwrite事件来显示你自己的提示,比如TaskDialogIndirect(),然后你可以让它显示你想要的任何文本和默认按钮。
  • IFileDialog::Get/SetOptions() 关闭 FOS_OVERWRITEPROMPT
  • @HansPassant IFileDialogEvents::OnOverwrite 需要启用FOS_OVERWRITEPROMPT
  • 该评论并非针对您。关键是要避免用覆盖警告吓跑用户。

标签: c++ winapi


【解决方案1】:
  1. 当用户使用现有名称保存文件时,会出现“确认另存为”提示。我需要将“是”选项标记为 默认而不是“否”。

正如@Remy Lebeau 所说,您可以使用IFileDialogEvents::OnOverwrite 方法。并使用MessageBox 创建合适的对话框。

一些代码:

 IFACEMETHODIMP OnOverwrite(IFileDialog* , IShellItem*psi, FDE_OVERWRITE_RESPONSE* response) {  
        int msgboxID = MessageBox(
            NULL,
            (LPCWSTR)L"Windows already exists,                 \n\rDo you want to replace it?",
            (LPCWSTR)L"Confirm Save As",
            MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON1
        );

        switch (msgboxID)
        {
        case IDYES:
            *response = FDEOR_ACCEPT;
            break;
        case IDNO:
            *response = FDEOR_REFUSE;
            break;  
        } 
        return S_OK; 
    }

调试:

用户可以从同一个对话框打开/加载文件或文件夹。能 这些可以用这个 API 完成吗?或者其他 API?

文档中没有这个方法,只能选择文件夹或文件。

作为一个折中方案,我建议你可以新建一个MessageBox,并在里面设置两个按钮,分别是“选择文件夹”和“选择文件”。当用户选择文件夹时,会打开FOS_PICKFOLDERS 样式的文件夹对话框。否则,默认选择文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2021-01-09
    • 2017-04-10
    • 2011-11-17
    相关资源
    最近更新 更多