關於VC彈出選擇文件夾對話框


VC編程中經常需要彈出選擇文件夾對話框供用戶選擇目標文件夾

基本實現的源碼如下

 1 void CTestDlg::OnBtnTest()   
2 {
3 // TODO: Add your control notification handler code here
4 TCHAR pszPath[MAX_PATH];
5 BROWSEINFO bi;
6 bi.hwndOwner = this->GetSafeHwnd();
7 bi.pidlRoot = NULL;
8 bi.pszDisplayName = NULL;
9 bi.lpszTitle = TEXT("請選擇文件夾");
10 bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
11 bi.lpfn = NULL;
12 bi.lParam = 0;
13 bi.iImage = 0;
14
15 LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
16 if (pidl == NULL)
17 {
18 return;
19 }
20
21 if (SHGetPathFromIDList(pidl, pszPath))
22 {
23 AfxMessageBox(pszPath);
24 }
25 }

這一般均能夠滿足要求,但有時還是需要在此基礎上增強一些功能。

比如在彈出選擇文件夾對話框時選中默認的文件夾,或在STATUSTEXT區域顯示一些信息等等。這需要在BrowseCallbackProc回調函數中實現。具體實現的源碼如下:

(具體BrowseCallBackFun回調函數的用法請參照MSDN)

 1 //選擇文件夾對話框回調函數  
2 int CALLBACK BrowseCallBackFun(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
3 {
4 switch(uMsg)
5 {
6 case BFFM_INITIALIZED: //選擇文件夾對話框初始化
7      //設置默認路徑為lpData即'D:\'
8 ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
9 //在STATUSTEXT區域顯示當前路徑
10 ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, lpData);
11 //設置選擇文件夾對話框的標題
12 ::SetWindowText(hwnd, TEXT("請先設置個工作目錄"));
13 break;
14 case BFFM_SELCHANGED: //選擇文件夾變更時
15 {
16 TCHAR pszPath[MAX_PATH];
17 //獲取當前選擇路徑
18 SHGetPathFromIDList((LPCITEMIDLIST)lParam, pszPath);
19 //在STATUSTEXT區域顯示當前路徑
20 ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)pszPath);
21 }
22 break;
23 }
24 return 0;
25 }
26
28 void CTestDlg::OnBtnTest()
29 {
30 // TODO: Add your control notification handler code here
31 TCHAR pszPath[MAX_PATH];
32 BROWSEINFO bi;
33 bi.hwndOwner = this->GetSafeHwnd();
34 bi.pidlRoot = NULL;
35 bi.pszDisplayName = NULL;
36 bi.lpszTitle = TEXT("請選擇文件夾");
37 bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
38 bi.lpfn = BrowseCallBackFun; //回調函數
39 bi.lParam = (LPARAM)TEXT("D:\\"); //傳給回調函數的參數,設置默認路徑
40 bi.iImage = 0;
41
42 LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
43 if (pidl == NULL)
44 {
45 return;
46 }
47
48 if (SHGetPathFromIDList(pidl, pszPath))
49 {
50 AfxMessageBox(pszPath);
51 }
52 }

附圖片:

當然也可以設置選擇文件對話框的其他樣式,比如使其具有新增文件夾的功能,可如下實現

bi.ulFlags        =        BIF_USENEWUI        

附圖:(改圖來源於www.VCKBASE.com,本人電腦上安裝的是VC6,不支持BIF_USENEWUI,請在VC2003+上嘗試)

具體請參照MSDN




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM