当前位置:编程学习 > Delphi >>

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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,