欢迎来到天天文库
浏览记录
ID:30429427
大小:93.51 KB
页数:19页
时间:2018-12-29
《windowsapi调用系统对话框》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、WindowsAPI调用系统对话框转一些从shell32.dll导出的函数外壳对话框外壳对话框的秘密常见的Windows的通用对话框被封装在Comdlg32.dll,这给我们的编程提供了很大的便利。但它还不够完整,我们在系统里经常能看到大量的可重复使用的对话框,但在Windows的文档里你却找不到它们的调用方法。而如果我们自己去做这样的界面是非常费时费力的而且也是没有必要的,因为这些对话框实际上很容易得到。这里我要介绍一些已经众所周知或不为认知的对话框,它们可以应用在我们的程序中使程序显得非常友好和专业。浏览文件夹对话框图2.23大多数Delphi程序员都知道如何使用VC
2、L的TOpenDialog控件来让用户浏览将要打开的文件。然而有时你可能只想让用户选择文件夹而不是特定的文件,windows已经提供了一个这样的对话框如图2.23所示。我们可以通过公开的函数SHBrowseForFolder来调用(这个函数定义在ShlObj单元),函数定义如下:functionSHBrowseForFolder(varBrowseInfo:TBrowseInfo):PItemIDList;stdcall;这个函数只有一个参数,但这个参数是一个比较复杂的记录类型TBrowseInfo=packedrecordhwndOwner:HWND;pidlRoot:
3、PItemIDList;pszDisplayName:PChar;lpszTitle:PChar;ulFlags:UINT;lpfn:TFNBFFCallBack;lParam:LPARAM;iImage:Integer;end;hwndOwner数据成员包含对话框的父窗体的窗口句柄,可以把它设成0。PIdlRoot数据成员指向一个PIDL的指针对应于对话框初始化时的根目录。指定了PIdlRoot后,就只有根目录及它的子目录会出现在对话框中。可以设定它为nil,这时缺省的根目录是桌面,pszDisplayName数据成员指向一个缓冲区可以用来储存被用户选中的文件名,缓冲区
4、的大小至少为MAX_PATH这个常数那么大,否则遇到特别长的文件名会溢出。lpszTitle数据对象指向一个以null结尾的字符串,字符串作为对话框的标题来显示。注意标题不要太长,否则显示时会被截断。ulFlags标志数据对象用来限制在对话框中显示的文件夹类型。可以设定它为0或下列值的组合://在对话框中会包含一个状态区,回调函数可以通过向对话框发送消息来设定状态BIF_STATUSTEXT//只允许选择标准文件系统,若选了非标准的文件夹如打印机,确认按钮会变灰BIF_RETURNONLYFSDIRS=[message]01;//不选择网络文件夹BIF_DONTGOBEL
5、OWDOMAIN=[message]02;//给状态条留出空白BIF_STATUSTEXT=[message]04;//只选择文件系统的上级目录BIF_RETURNFSANCESTORS=[message]08;//只选择计算机BIF_BROWSEFORCOMPUTER=00;//只选择打印机BIF_BROWSEFORPRINTER=00;//包括文件也可以选BIF_BROWSEINCLUDEFILES=00;注意:如果你想对话框显示lpszTitle里的用户定制的状态条信息,必须包括BIF_STATUSTEXT标识。Lpfn数据对象是一个回调函数类型的指针,函数类型如下
6、:TFNBFFCallBack=function(DialogHandle:HWND;MessageID:UINT;PIDL:PItemIDList;Data:LPARAM):Integer;stdcall;这是一个回调函数,可以用来在同用户交互时控制和更新对话框的显示。如果你不想控制对话框,可以把它设成nil,lParam数据对象允许你在回调函数中以参数lpfn形式返回一个指针(通常我们用它来返回对象),当然也可以把它设成为0。IImage数据成员不需要设置,因为它是用来接收系统中同文件夹相关的图标列表索引的,我们这里设它为0。SHBrowseForFolder函数返回
7、一个唯一的指向被选择的文件夹的PIDL。如果文件夹是一个传统的文件对象的话,可以用函数SHGetPathFromIDList把PIDL转换为真实的目录。同时,作为调用者,必须负责释放被返回的itemidentifierlist,使用IMallocCOM接口来释放。注意:不要用FreeMem或其他方法来释放PIDL,这是因为外壳的内存管理是独立的,只能用IMalloc来释放。现在我们已经可以显示对话框了,那让我们更深入一步看看如何能够控制对用户动作的反应,这就要用到了回调函数TFNBFFCallBack。注意回调函数的意思就是,
此文档下载收益归作者所有