【问题标题】:Refreshing IFileDialog view刷新 IFileDialog 视图
【发布时间】:2009-09-26 13:46:01
【问题描述】:

我们需要从 IFileDialogControlEvents::OnButtonClicked 更改活动的 Vista/Win7 打开文件对话框中的选定文件类型过滤器。 IFileDialog::SetFileTypeIndex 更新组合框中的文本,但项目列表没有刷新,这意味着项目不再反映“文件类型”组合框中的内容。

我们尝试了各种方法来刷新视图,但均未成功。有没有人有这样的技术?

一个可能的线索:即使您手动单击“刷新”按钮,视图也不会刷新,这使我们相信公共对话框中的内部值可能没有被 IFileDialog::SetFileTypeIndex 更新。我们还有什么需要做的吗?

更新: 结果表明,对 IFileDialog::GetFileTypeIndex 的后续调用不会返回我们刚刚使用 SetFileTypeIndex 设置的索引,即使组合框显示了正确的过滤器。这让我更加想,如果对话框已经打开,IFileDialog 中的某些内部值不会被 SetFileTypeIndex 更新。

更新: 这是一个 Windows 错误。请参阅下面的解决方法代码。

【问题讨论】:

  • 你能发布最小样本来重现这种行为吗?
  • Shay,在对话框打开后对 IFileDialog::SetFileTypeIndex 的任何使用都会导致此行为。它会更新控件中显示的过滤器,但不会更新 GetFileTypeIndex 返回的索引号,也不会刷新显示。 MS 已确认这是 Vista 和 Win7 RTM 中的错误。请参阅下面的解决方法代码

标签: filter


【解决方案1】:

您能提供您的 CFD 代码吗?这对我来说可以。这是你想要做的吗?

int _tmain(int argc, _TCHAR* argv[])
{
    IFileDialog *pfd = NULL;
    HRESULT hr = CoInitialize(NULL);

    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));
        if (SUCCEEDED(hr))
        {
            COMDLG_FILTERSPEC rgSpec[] = 
            {
                {L"Text Documents (*.txt)", L"*.txt"},
                {L"All Files (*.*)", L"*.*"}
            };
            hr = pfd->SetFileTypes(ARRAYSIZE(rgSpec), rgSpec);
            if (SUCCEEDED(hr))
            {
                UINT ix;
                pfd->Show(NULL);
                pfd->SetFileTypeIndex(2);
                pfd->Show(NULL);
                pfd->GetFileTypeIndex(&ix);
                printf("%d\n", ix);
            }
        }
    }
    return 0;
}

【讨论】:

  • Chinh,抱歉,我看的不是很清楚。当对话框在屏幕上时,我们需要从 IFileDialogControlEvents::OnButtonClicked 更改索引。我已更新问题以澄清这一点。
【解决方案2】:

Microsoft 已确认这是 Vista 和 Windows 7 RTM 中的一个错误。这是 MS 提供的解决方法。在我们的例子中,我们希望将文件类型过滤器设置为*.*。此代码将*.* 放入文件名编辑中,这会重置过滤器并刷新视图。 (我还没有调查如果您尝试使用 *.doc 或类似的东西设置不同的过滤器会发生什么。)

if (SUCCEEDED(pFileDialog->SetFileName(L""))
 && SUCCEEDED(pFileDialog->SetFileName(L"*.*")))
{
    IOleWindow *pOleWindow;
    if (SUCCEEDED(pFileDialog->QueryInterface(IID_PPV_ARGS(&pOleWindow))))
    {
        HWND hwnd;
        if (SUCCEEDED(pOleWindow->GetWindow(&hwnd)))
        {
            PostMessage(hwnd, WM_COMMAND, IDOK, 0);
        }
        pOleWindow->Release();
    }
}

(如果文件名编辑已经包含*.*,则代码设置文件名两次以绕过Windows代码将执行的一些优化。)

【讨论】:

    猜你喜欢
    • 2011-09-03
    • 2011-03-26
    • 1970-01-01
    • 2012-09-03
    • 2018-07-23
    • 2010-11-13
    • 2018-04-14
    • 2014-08-20
    相关资源
    最近更新 更多