Window SubClassing另類運用(之二)
你大概已經熟悉通用對話框(打開/保存文件,選擇字體/顏色,以及查找和替換)的使用,不過你是否了解如何調用“選擇文件夾”對話框呢?如果答案是否的話,你可以先看看一個簡單的例子,籍以做個熱身。如果你自認為已經了解它的話,可以跳過下面這一段。
要調用“選擇文件夾”對話框,和其他通用對話框所使用的方法非常類似:一個結構(BROWSEINFO)加一個函數(SHBrowseForFolder)即可。請看代碼:
procedure TForm1.Button2Click(Sender: TObject);
var
bi : BROWSEINFO;
szDisplay : array[0..MAX_PATH] of char;
pidl : PItemIDList;
str : string;
begin
with bi do begin
hwndOwner := Handle;
pidlRoot := nil;
pszDisplayName := szDisplay;
lpszTitle := Select a Directory;
ulFlags := BIF_RETURNONLYFSDIRS or BIF_STATUSTEXT;
lpfn := @BrowseCallback;
lParam := 0;
end;
pidl := SHBrowseForFolder(bi);
if pidl<>nil then begin
SetLength(str, MAX_PATH);
SHGetPathFromIDList(pidl, PChar(str));
str := PChar(str);
Caption := str;
CoTaskMemFree(pidl);
end;
end;
SHBrowseForFolder返回一個LPITEMIDLIST,你需要手動將它轉換成一個實際的文件路徑(除非你選擇的是回收站和控制面板這樣的虛擬路徑)。最後還要用Shell API把獲得的pidl釋放。上述代碼中,BrowseCallback是一個自己編寫的回調函數,如果不想處理回調的話,可以將它設置為nil。我還是處理了這個函數,因為我需要它的一些功能,如下:
function BrowseCallback(AWnd:HWND; uMsg:UINT; lp, lpData:LPARAM):Integer; stdcall;
var
strPath : string;