1. 程式人生 > >關於VC彈出選擇文件夾對話框

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

獲取 param ESS 目標 參數 tro election for his

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)

//選擇文件夾對話框回調函數
int CALLBACK BrowseCallBackFun(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    
switch(uMsg) { case BFFM_INITIALIZED: //選擇文件夾對話框初始化 //設置默認路徑為lpData即‘D:\‘ ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData); //在STATUSTEXT區域顯示當前路徑 ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, lpData); //設置選擇文件夾對話框的標題 ::SetWindowText(hwnd, TEXT("請先設置個工作目錄")); break; case BFFM_SELCHANGED: //選擇文件夾變更時 { TCHAR pszPath[MAX_PATH]; //獲取當前選擇路徑 SHGetPathFromIDList((LPCITEMIDLIST)lParam, pszPath); //在STATUSTEXT區域顯示當前路徑 ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)pszPath); } break; } return 0; } void CTestDlg::OnBtnTest() { // TODO: Add your control notification handler code here TCHAR pszPath[MAX_PATH]; BROWSEINFO bi; bi.hwndOwner = this->GetSafeHwnd(); bi.pidlRoot = NULL; bi.pszDisplayName = NULL; bi.lpszTitle = TEXT("請選擇文件夾"); bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT; bi.lpfn = BrowseCallBackFun; //回調函數 bi.lParam = (LPARAM)TEXT("D:\\"); //傳給回調函數的參數,設置默認路徑 bi.iImage = 0; LPITEMIDLIST pidl = SHBrowseForFolder(&bi); if (pidl == NULL) { return; } if (SHGetPathFromIDList(pidl, pszPath)) { AfxMessageBox(pszPath); } }

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