2009-09-26 101 views
1

我們需要在IFileDialogControlEvents :: OnButtonClicked的活動Vista/Win7打開文件對話框中更改選定的文件類型過濾器。 IFileDialog :: SetFileTypeIndex更新組合框中的文本,但項目列表未刷新,這意味着項目不再反映「文件類型」組合框中的內容。刷新IFileDialog視圖

我們嘗試過各種方式來刷新視圖,但沒有成功。有沒有人有一種技術來做到這一點?

一個可能的線索:即使手動單擊刷新按鈕也不刷新視圖,這導致我們相信公共對話框中的內部值可能不會被IFileDialog :: SetFileTypeIndex更新。還有什麼我們需要做的嗎?

更新:事實證明,以IFileDialog :: GetFileTypeIndex的後續調用不返回我們使用SetFileTypeIndex剛剛成立的指數,即使組合框顯示正確的過濾器。這讓我更加想到IFileDialog中有一些內部值,如果對話框已經打開,它不會被SetFileTypeIndex更新。

更新: 這是一個Windows錯誤。請參閱下面的解決方法代碼。

+0

你可以發佈min sample repro這個行爲嗎? – 2009-09-26 15:17:34

+0

在對話框打開之後,任何對IFileDialog :: SetFileTypeIndex的使用都會導致這種行爲。它更新控件中顯示的過濾器,但不更新由GetFileTypeIndex返回的索引號,並且不刷新顯示。 MS已經證實這是Vista和Win7 RTM中的一個錯誤。請參閱 – chrisd 2009-10-02 17:53:43

回答

1

微軟已確認這是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代碼將進行一些優化如果文件名編輯已經包含*.*。)

0

你能提供你的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; 
} 
+0

以下的解決方法代碼,對不起,我發現我並不完全清楚。我們需要在IFileDialogControlEvents :: OnButtonClicked對話框的屏幕上更改索引。我已經更新了這個問題來澄清這一點。 – chrisd 2009-09-29 10:29:48