刷新IFileDialog视图

时间:2009-09-26 13:46:01

标签: filter

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

我们尝试了各种方法来刷新视图,但没有成功。有没有人有技术可以做到这一点?

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

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

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

2 个答案:

答案 0 :(得分:1)

Microsoft已将此确认为Vista和Windows 7 RTM中的错误。这是MS提供的解决方法。在我们的示例中,我们要将文件类型过滤器设置为*.*。此代码将*.*放入文件名edit中,从而重置过滤器并刷新视图。 (我没有调查如果你尝试使用* .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代码在文件名编辑已包含*.*时将执行的一些优化。)

答案 1 :(得分:0)

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

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;
}