原文在 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~