原文在 http://delphi.ktop.com.tw/topic.asp?method=AnswerOK&topic_id=72744



#include

#include // 為了使用 GlobalFreePtr()



// 如果 shlobj.h 內未定義 BIF_NEWDIALOGSTYLE,請自定如下:

#define BIF_NEWDIALOGSTYLE 0x0040



/*


SetDirectory 自定函式:







功能簡述:



1. 顯示選擇目錄對話框,並提供 "新資料夾" 的按鈕項目,可在選擇目錄對話框直接建立新目錄。



2. 可取得被選擇目錄的路徑字串,以及被選擇目錄的名稱字串 (如果有的話)







bool SetDirectory(AnsiString StartDir, AnsiString *selDir, AnsiString *dirName)







參數說明:



StartDir: 開啟對話框時的起始目錄。



selDir: 選擇目錄後存放目錄路徑的字串,例如:
C:\



dirName: 選擇目錄後存放目錄名稱的字串,例如:本機磁碟 (C:)







傳回值: 取消傳回 false,選擇目錄則傳回 true



*/



int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lpData)

{

if(uMsg == BFFM_INITIALIZED)

{

PCSTR prevDir = reinterpret_cast (lpData);

if(DirectoryExists(prevDir))

{

SendMessage(hwnd, BFFM_SETSELECTION, static_cast (1L), lpData);



HWND shellCtrl = GetDlgItem(hwnd, 0);

if(shellCtrl != NULL)

{

HWND treeCtrl = GetDlgItem(shellCtrl, 0x64);

TVITEMEX tvi;

if(tvi.hItem = TreeView_GetSelection(treeCtrl))

{

TreeView_GetItem(hwnd, &tvi);

TreeView_Expand(treeCtrl, tvi.hItem, TVE_EXPAND);

}

}


}

}

return 0;

}




bool __fastcall SetDirectory(AnsiString StartDir, AnsiString *selDir, AnsiString *dirName)

{

auto bool rc = true;

BROWSEINFO bi;

char PathStr[MAX_PATH];

char FolderName[MAX_PATH];

LPITEMIDLIST ItemID;

memset(&bi, 0, sizeof(BROWSEINFO));

memset(PathStr, 0, MAX_PATH);

bi.hwndOwner = Application->Handle;

bi.pszDisplayName = FolderName;

bi.lpszTitle = "選擇資料夾";

bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN | BIF_NEWDIALOGSTYLE;

bi.lpfn = reinterpret_cast (BrowseCallbackProc);

bi.lParam = reinterpret_cast (StartDir.c_str());

CoInitialize(NULL);

ItemID = SHBrowseForFolder(&bi);

if(ItemID == NULL)

{

rc = false;

}

else

{

SHGetPathFromIDList(ItemID, PathStr);

}

GlobalFreePtr(ItemID);

CoUninitialize();

*selDir = PathStr;

*dirName = FolderName;

return rc;

}

// 使用範例

void __fastcall TForm1::Button1Click(TObject *Sender)

{

AnsiString StartDirectory = "C:\\";
// 設定對話框起始目錄

AnsiString SelectedDirectory; // 儲存被選擇目錄的路徑字串

AnsiString DirectoryName; // 儲存被選擇目錄的名稱字串

if(SetDirectory(StartDirectory, &SelectedDirectory, &DirectoryName))

{

ShowMessage("選擇目錄:"+SelectedDirectory+"\n目錄名稱:"+DirectoryName);

}

}



The End~


創作者介紹
創作者 Nelson 的頭像
Nelson

Nelson 的小世界

Nelson 發表在 痞客邦 留言(0) 人氣()