WindowSubClassing另类运用(之二)
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;
补充:软件开发 , Delphi ,