我们需要在IFileDialogControlEvents :: OnButtonClicked的活动Vista / Win7打开文件对话框中更改选定的文件类型过滤器。 IFileDialog :: SetFileTypeIndex更新组合框中的文本,但不刷新项目列表,这意味着项目不再反映“文件类型”组合框中的内容。
我们尝试了各种方法来刷新视图,但没有成功。有没有人有技术可以做到这一点?
一个可能的线索:即使您手动单击“刷新”按钮,视图也不会刷新,这使我们相信可能IFileDialog :: SetFileTypeIndex不会更新公共对话框中的内部值。我们需要做些什么吗?
更新:事实证明,对IFileDialog :: GetFileTypeIndex的后续调用不会返回我们刚使用SetFileTypeIndex设置的索引,即使组合框显示正确的过滤器。这让我更加想到,如果对话框已经打开,IFileDialog中有一些内部值不会被SetFileTypeIndex更新。
更新的 这是一个Windows错误。请参阅下面的解决方法代码。
答案 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;
}