版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Windows API調(diào)用系統(tǒng)對話框轉(zhuǎn)一些從shell32.dll導(dǎo)出的函數(shù)外殼對話框外殼對話框的秘密常見的Windows的通用對話框被封裝在Comdlg32.dll,這給我們的編程提供了很大的便利。但它還不夠完整,我們在系統(tǒng)里經(jīng)常能看到大量的可重復(fù)使用的對話框,但在Windows的文檔里你卻找不到它們的調(diào)用方法。而如果我們自己去做這樣的界面是非常費(fèi)時(shí)費(fèi)力的而且也是沒有必要的,因?yàn)檫@些對話框?qū)嶋H上很容易得到。這里我要介紹一些已經(jīng)眾所周知或不為認(rèn)知的對話框,它們可以應(yīng)用在我們的程序中使程序顯得非常友好和專業(yè)。瀏覽文件夾對話框圖2.23大多數(shù)Delphi程序員都知道如何使用VCL的TOpenDia
2、log控件來讓用戶瀏覽將要打開的文件。然而有時(shí)你可能只想讓用戶選擇文件夾而不是特定的文件,windows已經(jīng)提供了一個(gè)這樣的對話框如圖2.23所示。我們可以通過公開的函數(shù)SHBrowseForFolder來調(diào)用(這個(gè)函數(shù)定義在ShlObj單元),函數(shù)定義如下:function SHBrowseForFolder(var BrowseInfo:TBrowseInfo):PItemIDList;stdcall;這個(gè)函數(shù)只有一個(gè)參數(shù),但這個(gè)參數(shù)是一個(gè)比較復(fù)雜的記錄類型TBrowseInfo=packed record hwndOwner:HWND;pidlRoot:PItemIDList;pszDi
3、splayName:PChar;lpszTitle:PChar;ulFlags:UINT;lpfn:TFNBFFCallBack;lParam:LPARAM;iImage:Integer;end;hwndOwner數(shù)據(jù)成員包含對話框的父窗體的窗口句柄,可以把它設(shè)成0。PIdlRoot數(shù)據(jù)成員指向一個(gè)PIDL的指針對應(yīng)于對話框初始化時(shí)的根目錄。指定了PIdlRoot后,就只有根目錄及它的子目錄會(huì)出現(xiàn)在對話框中??梢栽O(shè)定它為nil,這時(shí)缺省的根目錄是桌面,pszDisplayName數(shù)據(jù)成員指向一個(gè)緩沖區(qū)可以用來儲(chǔ)存被用戶選中的文件名,緩沖區(qū)的大小至少為MAX_PATH這個(gè)常數(shù)那么大,否則遇到特別
4、長的文件名會(huì)溢出。lpszTitle數(shù)據(jù)對象指向一個(gè)以null結(jié)尾的字符串,字符串作為對話框的標(biāo)題來顯示。注意標(biāo)題不要太長,否則顯示時(shí)會(huì)被截?cái)唷lFlags標(biāo)志數(shù)據(jù)對象用來限制在對話框中顯示的文件夾類型。可以設(shè)定它為0或下列值的組合:/在對話框中會(huì)包含一個(gè)狀態(tài)區(qū),回調(diào)函數(shù)可以通過向?qū)υ捒虬l(fā)送消息來設(shè)定狀態(tài)BIF_STATUSTEXT/只允許選擇標(biāo)準(zhǔn)文件系統(tǒng),若選了非標(biāo)準(zhǔn)的文件夾如打印機(jī),確認(rèn)按鈕會(huì)變灰BIF_RETURNONLYFSDIRS=message01;/不選擇網(wǎng)絡(luò)文件夾BIF_DONTGOBELOWDOMAIN=message02;/給狀態(tài)條留出空白BIF_STATUSTEXT=m
5、essage04;/只選擇文件系統(tǒng)的上級目錄BIF_RETURNFSANCESTORS=message08;/只選擇計(jì)算機(jī)BIF_BROWSEFORCOMPUTER=00;/只選擇打印機(jī)BIF_BROWSEFORPRINTER=00;/包括文件也可以選BIF_BROWSEINCLUDEFILES=00;注意:如果你想對話框顯示lpszTitle里的用戶定制的狀態(tài)條信息,必須包括BIF_STATUSTEXT標(biāo)識(shí)。Lpfn數(shù)據(jù)對象是一個(gè)回調(diào)函數(shù)類型的指針,函數(shù)類型如下:TFNBFFCallBack=function(DialogHandle:HWND;MessageID:UINT;PIDL:PIt
6、emIDList;Data:LPARAM):Integer;stdcall;這是一個(gè)回調(diào)函數(shù),可以用來在同用戶交互時(shí)控制和更新對話框的顯示。如果你不想控制對話框,可以把它設(shè)成nil,lParam數(shù)據(jù)對象允許你在回調(diào)函數(shù)中以參數(shù)lpfn形式返回一個(gè)指針(通常我們用它來返回對象),當(dāng)然也可以把它設(shè)成為0。IImage數(shù)據(jù)成員不需要設(shè)置,因?yàn)樗怯脕斫邮障到y(tǒng)中同文件夾相關(guān)的圖標(biāo)列表索引的,我們這里設(shè)它為0。SHBrowseForFolder函數(shù)返回一個(gè)唯一的指向被選擇的文件夾的PIDL。如果文件夾是一個(gè)傳統(tǒng)的文件對象的話,可以用函數(shù)SHGetPathFromIDList把PIDL轉(zhuǎn)換為真實(shí)的目錄。同
7、時(shí),作為調(diào)用者,必須負(fù)責(zé)釋放被返回的item identifier list,使用IMalloc COM接口來釋放。注意:不要用FreeMem或其他方法來釋放PIDL,這是因?yàn)橥鈿さ膬?nèi)存管理是獨(dú)立的,只能用IMalloc來釋放。現(xiàn)在我們已經(jīng)可以顯示對話框了,那讓我們更深入一步看看如何能夠控制對用戶動(dòng)作的反應(yīng),這就要用到了回調(diào)函數(shù)TFNBFFCallBack。注意回調(diào)函數(shù)的意思就是,你只是實(shí)現(xiàn)了它,系統(tǒng)就知道什么時(shí)候去調(diào)用它,就好比一個(gè)守株待兔的例子。DialogHandle參數(shù)代表對話框窗口句柄。通常可以用這個(gè)句柄給對話框發(fā)消息,MessageID參數(shù)并不是一個(gè)TMessage結(jié)構(gòu)的記錄,它是
8、對話框通過回調(diào)函數(shù)發(fā)給用戶消息的,它可以是下面兩個(gè)值:BFFM_INITIALIZED=1;/對話框?qū)⒁@示BFFM_SELCHANGED=2;/用戶選中了某項(xiàng)PIDL參數(shù)包含其他的額外信息。如果MessageID是BFFM_INITIALIZED,PIDL將等于nil。如果MessageID是BFFM_SELCHANGED,PIDL的值將是一個(gè)PIDL對應(yīng)于用戶選擇的文件夾。Data參數(shù)包含用戶付給TbrowseInfo記錄中的Lparam數(shù)據(jù)成員的值,通常可以傳遞一個(gè)對象指針。下面是一個(gè)簡單的回調(diào)函數(shù)的例子:function BrowseForFolderCallback(DialogHa
9、ndle:HWND;MessageID:UINT;PIDL:PItemIDList;Data:LPARAM):Integer;begin/響應(yīng)對話框的通知消息case(MessageID)of BFFM_INITIALIZED:DialogInitialized(DialogHandle,Data);BFFM_SELCHANGED:HandleNewSelection(DialogHandle,PIDL,Data);end;Result:=0;/總返回0.end;在回調(diào)函數(shù)里,可以根據(jù)用戶的輸入發(fā)送三個(gè)用戶的消息給對話框,下面是消息ID:/改變對話框的狀態(tài)信息BFFM_SETSTATUSTEX
10、T=WM_USER+100;/控制確定按鈕失效與否BFFM_ENABLEOK=WM_USER+101;/改變選擇的文件夾BFFM_SETSELECTION=WM_USER+102;通常,這些消息發(fā)送給對話框使之根據(jù)用戶的選擇更新顯示,當(dāng)然你也可以發(fā)送其他的消息給對話框,比如可以發(fā)送WM_SETTEXT消息來改變對話框的標(biāo)題。下面是一個(gè)發(fā)送消息的例子(見表2.11):PostMessage(DialogHandle,BFFM_SETSELECTION,True,LPARAM(PChar(NewPath);表2.11 Message IDWParamLParam BFFM_SETSTATUSTEX
11、T沒有使用一個(gè)指向新的狀態(tài)信息的Pchar BFFM_ENABLEOK沒有使用True使得確認(rèn)按鈕有效,F(xiàn)alse無效BFFM_SETSELECTION如果Lparam是路徑則為True,若Lparam是PIDL則為False指向被選擇的文件路徑或PIDL的Pchar另外要提到的是,Delphi也提供了對這個(gè)函數(shù)的封裝,那就是SelectDirectory函數(shù)。關(guān)于對話框通常我們都要在自己的程序里加上一個(gè)關(guān)于對話框來顯示一些版本信息等等,Windows為我們提供了一個(gè)標(biāo)準(zhǔn)的對話框如圖2.24所示,可以在一定范圍內(nèi)對它定制,不過它只適合顯示簡單的標(biāo)識(shí)和文本(我覺得用處極小)。我們可以通過函數(shù)Sh
12、ellAbout來調(diào)用它(聲明在ShellAPI單元里),函數(shù)定義如下:function ShellAbout(Owner:HWND;ApplicationName:PChar;OtherText:PChar;IconHandle:HICON):Integer;stdcall;Owner參數(shù)標(biāo)識(shí)了擁有對話框的父窗體句柄,通常設(shè)為0,表明沒有父窗體。ApplicationName參數(shù)包含對話框的標(biāo)題,字符串中可以包含#字符,它能起到分割符的作用。這種情況下,函數(shù)會(huì)把分割符前的字符串作為標(biāo)題欄,分割符后的部分作為Microsoft字符串后的第一行。OtherText參數(shù)包含了打算顯示在Micros
13、oft版本和版權(quán)信息后的字符串。IconHandle參數(shù)標(biāo)識(shí)了打算顯示在對話框上的圖標(biāo)標(biāo)識(shí),如果設(shè)為0,函數(shù)會(huì)顯示W(wǎng)indows缺省的圖標(biāo)。圖2.24圖2.25格式化對話框SHFormatDrive函數(shù)會(huì)顯示一個(gè)格式化對話框,如圖2.25所示,它是一個(gè)半公開的函數(shù)。但現(xiàn)在它不在微軟的SDK里。然而微軟承認(rèn)它的存在并把它從Shell32.dll里用名字公開聲明,Delphi中的函數(shù)定義如下:function SHFormatDrive(Owner:HWND;Drive:UINT;FormatID:UINT;OptionFlags:UINT):DWORD;stdcall;Owner參數(shù)標(biāo)識(shí)擁有對話
14、框的窗體句柄,文檔中推薦不要設(shè)為0,但實(shí)際上好像沒什么影響。Drive參數(shù)是用來標(biāo)識(shí)打算格式化的驅(qū)動(dòng)器的數(shù)值,它是以0為底的,從A開始A:=0,B:=1依此類推。FormatID參數(shù)允許我們指定一個(gè)格式化的模板,通常情況下,只要賦值為SHFMT_ID_DEFAULT就可以了。OptionFlags參數(shù)是一個(gè)選項(xiàng)掩碼,來確定格式化的選項(xiàng)。當(dāng)前有兩個(gè)選項(xiàng):SHFMT_OPT_FULL=message01;/快速格式化SHFMT_OPT_SYSONLY=message02;/復(fù)制系統(tǒng)文件如果函數(shù)調(diào)用失敗,會(huì)返回下列錯(cuò)誤中的一種來表明錯(cuò)誤原因,錯(cuò)誤常數(shù)如下:SHFMT_NOFORMAT=$FFFFFF
15、FD;/驅(qū)動(dòng)器無法格式化SHFMT_CANCEL=$FFFFFFFE;/格式化被取消了SHFMT_ERROR=$FFFFFFFF;/其他錯(cuò)誤Windows NT和WideChar在進(jìn)一步研究未公開的函數(shù)前,我們必須清楚一點(diǎn),對于未公開的函數(shù)來說以null結(jié)尾的字符串類型參數(shù)大多數(shù)被聲明為類型指針而不是PChar。這有點(diǎn)像陷阱,但必須承認(rèn)這是事實(shí)。在Win 9X上所有的字符串類型參數(shù)聲明為PAnsiChar,而在Windows NT上被聲明為PWideChar。如果你想你的應(yīng)用程序適應(yīng)所有平臺(tái),你必須考慮兩種情況,在運(yùn)行時(shí)要判斷平臺(tái)類型,這是很討厭的,但這也是使用未公開的API的代價(jià)。選擇圖標(biāo)對
16、話框圖2.26我們要討論的第一個(gè)完全未公開的函數(shù)是PickIconDlg。如圖2.26所示這個(gè)函數(shù)會(huì)顯示一個(gè)對話框,用戶可以用來從文件中選擇一個(gè)圖標(biāo)資源。它通常是用文件類型編輯器來關(guān)聯(lián)圖標(biāo)和某一文件類型的,也會(huì)在快捷方式對話框中被調(diào)用來修改快捷方式的圖標(biāo)。這個(gè)函數(shù)從Shell32.dll用值62來公開出來,函數(shù)定義如下:function PickIconDlg(Owner:HWND;FileName:Pointer;MaxFileNameChars:DWORD;var IconIndex:DWORD):LongBool;stdcall;Owner參數(shù)和上面的意義類似。FileName參數(shù)指向一
17、個(gè)緩沖區(qū),包含了被瀏覽圖標(biāo)的文件名,緩沖區(qū)要不小于MAX_PATH+1。MaxFileNameChars指定字符數(shù)量大小。IconIndex常數(shù)是以0為底的圖標(biāo)索引,當(dāng)對話框打開時(shí)會(huì)把焦點(diǎn)定在IconIndex對應(yīng)的圖標(biāo)上,函數(shù)返回后,IconIndex指向最后被選的圖標(biāo)索引。如果用戶點(diǎn)了取消按鈕,函數(shù)返回False。運(yùn)行程序?qū)υ捒驁D2.27 RunFileDlg函數(shù)是相當(dāng)靈活的,如圖2.27所示就是調(diào)用開始菜單的運(yùn)行子菜單后會(huì)顯示的對話框,我們通過值61把它從Shell32.dll暴露出來。下面是函數(shù)聲明:procedure RunFileDlg(Owner:HWND;IconHandle:
18、HICON;WorkPath:Pointer;Caption:Pointer;Description:Pointer;Flags:UINT);stdcall;Owner參數(shù)就不用再說了。IconHandle參數(shù)是顯示在對話框上的圖標(biāo)句柄,如果為nil,缺省的icon將會(huì)使用。WorkPath參數(shù)指向一個(gè)字符串來指定應(yīng)用程序運(yùn)行的工作路徑。Title參數(shù)指向作為對話框標(biāo)題的字符串,如果為nil,就使用缺省的標(biāo)題。Description參數(shù)指向一個(gè)描述字符串,主要是告訴用戶如何去做,可以設(shè)為nil,這時(shí)使用缺省的描述。Flags參數(shù)用一組位掩碼來設(shè)定對話框的屬性。下面是定義:RFF_NOBROWS
19、E=;/移去瀏覽按鈕RFF_NODEFAULT=;/無缺省的選項(xiàng)RFF_CALCDIRECTORY=;/由文件名確定工作路徑RFF_NOLABEL=;/去掉編輯框標(biāo)簽RFF_NOSEPARATEMEM=;/去掉在單獨(dú)的內(nèi)存空間運(yùn)行的復(fù)選框(只對NT有效)這個(gè)對話框一個(gè)很好的特性是允許你控制用戶可以運(yùn)行的應(yīng)用程序。當(dāng)用戶選擇了確認(rèn)按鈕,對話框的父窗體會(huì)發(fā)送一個(gè)通知消息來傳遞將要運(yùn)行的程序信息。通知消息是一個(gè)WM_NOTIFY消息,它的通知代碼設(shè)定為RFN_VALIDATE(-510),然后lParam指向一個(gè)TNM_RunFileDlg記錄。定義如下:TNM_RunFileDlg=packed
20、record hdr:TNMHdr;lpFile:Pointer;lpDirectory:Pointer;nShow:LongBool;end;hdr數(shù)據(jù)對象是TNMHdr類型,它是一種標(biāo)準(zhǔn)的Windows數(shù)據(jù)類型,每個(gè)WM_NOTIFY消息的lParam參數(shù)都會(huì)指向這個(gè)數(shù)據(jù)成分。同時(shí)根據(jù)不同的消息類型,可能一些額外的數(shù)據(jù)跟在記錄后面,標(biāo)準(zhǔn)的TNMHdr記錄定義如下:TNMHdr=packed record hwndFrom:HWND;idFrom:UINT;code:UINT;end;記錄中的hwndFrom包含發(fā)送消息的窗口句柄,idFrom則包含發(fā)送消息的控件標(biāo)示符,code中包含標(biāo)識(shí)被
21、發(fā)送的消息的通知代碼。在TNMHdr記錄后被打包的額外數(shù)據(jù)包含三個(gè)數(shù)據(jù)成分:LpFile指向一個(gè)包含將要運(yùn)行的文件的路徑字符串;LpDirectory指向正在運(yùn)行程序的工作目錄字符串;最后,nShow用來指定將要運(yùn)行的應(yīng)用程序是否可見。對于本文中特定的消息,只對TNMHdr記錄中的Code感興趣,通過檢驗(yàn)Code可以確保我們收到一個(gè)運(yùn)行文件校驗(yàn)消息,同時(shí)使我們可以存取額外的TNM_RunFileDlg數(shù)據(jù)成員。當(dāng)TNMHdr記錄中的code等于RFN_VALIDATE(-510)時(shí),可以獲得一個(gè)TNM_RunFileDlg記錄。下面是校驗(yàn)消息的代碼:var FileToRun:String;.
22、if TheMessage.Msg=WM_NOTIFY then if PNMHdr(TheMessage.LParam).code=RFN_VALIDATE then WideCharToStrVar(PNM_RUNFILEDLG(TheMessage.LParam).lpFile,FileToRun);.注意只有當(dāng)我們已經(jīng)檢驗(yàn)TNMHdr的Code為RFN_VALIDATE后,才映射LParam參數(shù)為PNM_RunFileDlg類型。通知消息的返回值決定了應(yīng)用程序是否能夠運(yùn)行,下面是可能的值:RF_OK=message;/允許程序運(yùn)行RF_CANCEL=;/取消操作,關(guān)閉對話框RF_RET
23、RY=;/取消操作,對話框仍然打開查找文件對話框圖2.28調(diào)用查找文件對話框的函數(shù)是SHFindFiles,對話框如圖2.28所示。它是從Shell32.dll按索引值90公開出來的:function SHFindFiles(SearchRoot:PItemIDList;SavedSearchFile:PItemIDList):LongBool;stdcall;SearchRoot參數(shù)允許從一個(gè)特定的文件夾開始查找,同在資源管理器中在文件夾上用右鍵點(diǎn)擊查找菜單的效果是一樣的。如果設(shè)為nil,那么查找是從桌面開始的。SavedSearchFile參數(shù)讓你指定一個(gè)以前查詢保存的查找策略文件(*.f
24、nd文件),根據(jù)以前的設(shè)定來查找,若不需要的話可以設(shè)定為nil。如果你指定了一個(gè)非空值的SearchRoot PIDL,那么在調(diào)用完SHFindFiles后必須負(fù)責(zé)釋放掉。但是有點(diǎn)奇怪的是,如果你指定了一個(gè)非空的SavedSearchFile PIDL參數(shù),函數(shù)成功調(diào)用的話,你不能去釋放這個(gè)PIDL,否則會(huì)出錯(cuò),但如果調(diào)用失敗了的話,你必須釋放它。同大多數(shù)對話框函數(shù)不一樣,這個(gè)函數(shù)是非模態(tài)的,也就是系統(tǒng)在另外一個(gè)獨(dú)立的線程中啟動(dòng)對話框,然后立即返回,對話框會(huì)在你的程序結(jié)束后自動(dòng)關(guān)閉。也就是說你沒有任何直接的方法來告訴用戶如何使用查找到的結(jié)果,所以要想知道用戶找到的文件的話,最好是讓你的程序支持
25、文件拖放,以便讓用戶把找到的文件拖放給你。查找電腦對話框同SHFindFiles比較接近的一個(gè)函數(shù)是SHFindComputer,這個(gè)函數(shù)調(diào)用的結(jié)果同開始菜單上查找電腦菜單調(diào)用的結(jié)果是一樣的。它的參數(shù)同SHFindFiles完全一樣,不同之處在于它完全忽略傳遞給它的參數(shù),很顯然是保留起來為了將來擴(kuò)展的需要。這里我們只要把參數(shù)都設(shè)成nil就可以了,另外注意這個(gè)對話框也是非模態(tài)的。SHFindComputer是從Shell32.dll以索引號91公開出來的:function SHFindComputer(Reserved1:PItemIDList;Reserved2:PItemIDList):Lo
26、ngBool;stdcall;查找文件對話框通過調(diào)用GetFileNameFromBrowse函數(shù)可以調(diào)出這個(gè)對話框,不過說實(shí)在的,它實(shí)際上只是GetOpenFileName函數(shù)的簡單封裝。而我們常用的TOpenDialog控件也是對GetOpenFileName函數(shù)封裝,這個(gè)函數(shù)我們很少會(huì)去直接用它。不過還是寫出來吧,它是從Shell32.dll里按索引值63公開出來的:function GetFileNameFromBrowse(Owner:HWND;FileName:Pointer;MaxFileNameChars:DWORD;InitialDirectory:Pointer;Defau
27、ltExtension:Pointer;Filter:Pointer;Caption:Pointer):LongBool;stdcall;圖2.29大多數(shù)參數(shù)對應(yīng)于OPENFILENAME結(jié)構(gòu)的成員。Owner參數(shù)我想就不用再重復(fù)了,F(xiàn)ileName參數(shù)指向一個(gè)初始化對話框編輯控制文件名的緩沖區(qū),函數(shù)返回后FileName包含被選擇的文件路徑,它的大小一般設(shè)成MAX_PATH+1那么大。MaxFileNameChars參數(shù)用來指定FileName緩沖區(qū)的大小。InitialDirectory參數(shù)指向?qū)υ捒虺跏蓟哪夸浢?,但如果FileName參數(shù)被指定了,InitialDirectory就會(huì)被
28、忽略而使用FileName參數(shù)中的路徑。DefaultExtension參數(shù)指向一個(gè)包含要搜索的缺省擴(kuò)展名的字符串。Filter參數(shù)指向一個(gè)以null結(jié)尾的可以用來在下拉列表中限定文件類型的過濾字符串。Caption參數(shù)指向?qū)υ捒驑?biāo)題字符串。如果用戶選擇了一個(gè)要打開的文件,函數(shù)返回True,當(dāng)有錯(cuò)誤發(fā)生,用戶選擇取消按鈕或關(guān)閉對話框的話會(huì)返回False。外殼對象屬性對話框另一個(gè)未公開的對話框函數(shù)是SHObjectProperties,它可以用來顯示外殼對象的屬性,比如驅(qū)動(dòng)器、文件夾或文件等,運(yùn)行效果如圖2.29所示。函數(shù)可以從Shell32.dll中按索引值178公開出來,定義如下:funct
29、ion SHObjectProperties(Owner:HWND;Flags:UINT;ObjectName:Pointer;InitialTabName:Pointer):LongBool;stdcall;Flags參數(shù)用來指定ObjectName參數(shù)對應(yīng)對象的類型,它可以是下列標(biāo)識(shí):/打印機(jī)OPF_PRINTERNAME=;/路徑OPF_PATHNAME=;ObjectName參數(shù)指向一個(gè)包含路徑名的字符串或是要顯示屬性的打印機(jī)名。如果打印機(jī)是本地的,可以使用實(shí)際的打印機(jī)名,如果是網(wǎng)絡(luò)打印機(jī),就需要使用完整的UNC樣式名稱,比如COMPUTERNAMEPRINTERNAME。Initia
30、lTabName參數(shù)指向一個(gè)屬性對話框中頁面名稱字符串,用來指定要顯示的缺省頁面。如果InitialTabName參數(shù)為nil,或不匹配任何頁面的名稱,第一個(gè)屬性頁面將會(huì)被顯示。如果函數(shù)調(diào)用成功會(huì)返回True,如果失敗會(huì)返回False。要想獲得擴(kuò)展的錯(cuò)誤信息,可以調(diào)用API函數(shù)GetLastError。要注意的是這個(gè)對話框是非模態(tài)的,類似于查找文件對話框,所以函數(shù)一被調(diào)用,就肯定會(huì)顯示一個(gè)對話框,同時(shí)我們沒有辦法知道用戶什么時(shí)候關(guān)閉了對話框。映射網(wǎng)絡(luò)驅(qū)動(dòng)對話框圖2.30圖2.30顯示了映射網(wǎng)絡(luò)驅(qū)動(dòng)器的對話框,我們通過SHNetConnectionDialog函數(shù)調(diào)用它(win 9x和Win N
31、T上都支持),它可以按索引值160從Shell32.dll暴露出來,函數(shù)定義如下:function SHNetConnectionDialog(Owner:HWND;ResourceName:Pointer;ResourceType:DWORD):DWORD;stdcall;SHStartNetConnectionDialog函數(shù)也會(huì)顯示同樣的對話框,但它顯示的對話框是非模態(tài)的,同時(shí)只在NT上才支持。它可以按索引值215從Shell32.dll中公開出來,函數(shù)定義如下:function SHStartNetConnectionDialog(Owner:HWND;ResourceName:PWi
32、deChar;ResourceType:DWORD):DWORD;stdcall;上面兩個(gè)函數(shù)的參數(shù)完全相同。其中ResourceName參數(shù)指向一個(gè)要連接的網(wǎng)絡(luò)資源UNC路徑名。指定了這個(gè)參數(shù)的話,顯示的對話框中被預(yù)設(shè)的連接資源就不可改變了。如果這個(gè)參數(shù)為nil,則在對話框中用戶可以指定要連接的資源。ResourceType參數(shù)可以是下面的值之一:RESOURCETYPE_DISK或RESOURCETYPE_PRINT。它的不同將會(huì)生成不同的對話框。參數(shù)為RESOURCETYPE_DISK允許我們?yōu)榫W(wǎng)絡(luò)驅(qū)動(dòng)資源指定一個(gè)盤符,另一個(gè)參數(shù)允許我們映射一個(gè)并行口名比如LPT2為一個(gè)網(wǎng)絡(luò)打印機(jī)。然而
33、,不知道為什么RESOURCETYPE_PRINT參數(shù)在NT上無效。圖2.31如果函數(shù)調(diào)用成功的話,返回值是NO_ERROR,如果用戶取消的對話框,則返回-1($FFFFFFFF),如果調(diào)用失敗則返回其他的錯(cuò)誤代碼,具體錯(cuò)誤信息可以用GetLastError API調(diào)用獲得。關(guān)閉系統(tǒng)對話框ExitWindowsDialog和RestartDialog函數(shù)可以用來顯示關(guān)閉和重啟系統(tǒng)對話框(如圖2.31),它們同公開的ExitWindowsEx API函數(shù)沒有什么太大的不同,但在其過程中都會(huì)產(chǎn)生一個(gè)對話框。ExitWindowsDialog函數(shù)可以按索引值60從Shell32.dll中公開出來,R
34、estartDialog函數(shù)的在Shell32.dll中的索引值則是59,兩個(gè)函數(shù)的定義如下:procedure ExitWindowsDialog(Owner:HWND);stdcall;function RestartDialog(Owner:HWND;Reason:Pointer;ExitType:UINT):DWORD;stdcall;對ExitWindowsDialog函數(shù)來說,對話框好像并不使用Owner參數(shù)作為父窗口,在Windows 95上,當(dāng)操作成功的話owner窗口會(huì)收到一個(gè)WM_QUIT消息。在Windows NT上,owner窗口根本不被使用。同時(shí)這個(gè)函數(shù)沒有返回值,所
35、以沒有辦法知道用戶選擇了什么操作以及操作是否被取消了。RestartDialog函數(shù)更有用一些,當(dāng)我們修改了系統(tǒng)的設(shè)置,并希望重新啟動(dòng)系統(tǒng)使修改生效的時(shí)候可以使用這個(gè)函數(shù)。Reason參數(shù)指向一個(gè)要顯示在對話框中的字符串,用來解釋關(guān)閉系統(tǒng)的原因。ExitType參數(shù)指定關(guān)閉類型,可以使用ExitWindowsEX函數(shù)使用值的一個(gè)子集及額外的幾個(gè)新值,下面是它們的完全列表:EWX_LOGOFF=message;EWX_SHUTDOWN=;EWX_REBOOT=;EW_RESTARTWINDOWS=;EW_REBOOTSYSTEM=;EW_EXITANDEXECAPP=;如果用戶選擇執(zhí)行關(guān)閉操作,
36、函數(shù)返回IDYES,否則返回IDNO。要注意的是顯示在對話框中的原因字符串后總會(huì)跟著一個(gè)系統(tǒng)缺省提供的字符串用來顯示確認(rèn)信息,所以應(yīng)該在我們的Reason字符串后附上空格或回車換行字符。另外返回值不能用于確定操作的成功性,它只表明用戶的選擇,如果重啟操作由于某些原因失敗了,返回值仍然是IDYES。同時(shí)要注意的是要想調(diào)用成功,用戶還必須有SE_SHUTDOWN_NAME權(quán)限(在NT上)。缺少內(nèi)存對話框SHOutOfMemoryMessageBox是一個(gè)未公開的函數(shù),當(dāng)系統(tǒng)內(nèi)存不足時(shí)可以用來顯示標(biāo)準(zhǔn)的外殼信息對話框,它在Shell32.dll中的索引值是126,函數(shù)定義如下:function SH
37、OutOfMemoryMessageBox(Owner:HWND;Caption:Pointer;Style:UINT):Integer;stdcall;它會(huì)調(diào)用MessageBox API,同時(shí)傳遞3個(gè)標(biāo)準(zhǔn)的參數(shù)和ERROR_OUTOFMEMORY錯(cuò)誤消息。Caption參數(shù)指向?qū)υ捒驑?biāo)題字符串。如果Caption為nil,父窗口的標(biāo)題就會(huì)被使用。Style參數(shù)可以被設(shè)置為任意MessageBox函數(shù)使用的MB_XXX常數(shù)的組合,通常設(shè)置它為MB_OK或MB_ICONHAND。函數(shù)調(diào)用返回值參見SDK中MessageBox函數(shù)說明。當(dāng)MessageBox函數(shù)被調(diào)用時(shí),MB_SETFOREGR
38、OUND標(biāo)識(shí)會(huì)被添加到Style參數(shù)中,但如果第一次調(diào)用失敗了的話,MessageBox函數(shù)會(huì)被再次調(diào)用,這次MB_SYSTEMMODAL標(biāo)識(shí)會(huì)被添加到Style參數(shù)中。MB_SYSTEMMODAL同MB_ICONHAND標(biāo)識(shí)結(jié)合后會(huì)忽略內(nèi)存狀況來顯示消息對話框。當(dāng)內(nèi)存確實(shí)不足時(shí),函數(shù)不會(huì)顯示任何東西,然而它仍然會(huì)返回MessageBox函數(shù)調(diào)用結(jié)果。所以我們可以根據(jù)返回值判斷函數(shù)是否調(diào)用成功了??臻g不足對話框圖2.32另一個(gè)資源相關(guān)的函數(shù)是SHHandleDiskFull,它會(huì)顯示磁盤不足的信息對話框(如圖2.32)。我們可以在由于沒有足夠磁盤空間時(shí)導(dǎo)致程序無法運(yùn)行的條件下調(diào)用這個(gè)函數(shù),調(diào)用后,如果回收站中有什么東西沒有刪除的話,對話框允許用戶清空回收站來釋放磁盤空間。它在Shell32.dll中的索引值為185,函數(shù)的定義如下:procedure SHHandleDiskFull(Owner:HWND;Drive:UINT);stdcall;Drive參數(shù)用于指定以0為底的驅(qū)動(dòng)器盤符。0代表A:,1代表B:,依此類推。這個(gè)函數(shù)的應(yīng)用比
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)古詩學(xué)習(xí)指南模板
- 二零二五年度股權(quán)激勵(lì)項(xiàng)目執(zhí)行標(biāo)準(zhǔn)合同6篇
- 二零二五年度項(xiàng)目安全生產(chǎn)責(zé)任制計(jì)劃合同范本3篇
- 醫(yī)療技術(shù)進(jìn)步與創(chuàng)新教育的互動(dòng)關(guān)系
- 2024版商業(yè)反擔(dān)保合同示范文本版B版
- 多角度解析辦公室工作中技術(shù)影響和作用
- 2025年度杭州市二手房買賣合同中的隱私保護(hù)3篇
- 2025擔(dān)保合同標(biāo)準(zhǔn)范本
- 教學(xué)醫(yī)院實(shí)驗(yàn)室的團(tuán)隊(duì)協(xié)作案例
- 二零二五年度能源進(jìn)出口貿(mào)易磋商與合同簽訂規(guī)范2篇
- CSCO胃癌診療指南轉(zhuǎn)移性胃癌更新解讀
- 充電樁建設(shè)項(xiàng)目預(yù)算報(bào)告
- 《網(wǎng)絡(luò)安全等級保護(hù)條例》
- 宜昌市夷陵區(qū)2023-2024學(xué)年八年級上學(xué)期期末數(shù)學(xué)評估卷(含答案)
- 企劃品宣部人員架構(gòu)及職責(zé)
- 高效復(fù)習(xí)+期末動(dòng)員+高二上學(xué)期考前動(dòng)員主題班會(huì)
- 鉛鋅礦資源的勘查與儲(chǔ)量評估
- 非遺傳統(tǒng)手工藝教學(xué)總結(jié)
- 2024年國新國際投資有限公司招聘筆試參考題庫含答案解析
- 2023全國重點(diǎn)高中自主招生考試數(shù)學(xué)試卷大全
- 問題樓盤輿情應(yīng)急預(yù)案范文
評論
0/150
提交評論