《新編Visual-Basic程序設(shè)計(jì)教程》第14章_第1頁
《新編Visual-Basic程序設(shè)計(jì)教程》第14章_第2頁
《新編Visual-Basic程序設(shè)計(jì)教程》第14章_第3頁
《新編Visual-Basic程序設(shè)計(jì)教程》第14章_第4頁
《新編Visual-Basic程序設(shè)計(jì)教程》第14章_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第14章

操作Windows環(huán)境使用剪貼板激活其他Windows應(yīng)用程序中斷和后臺(tái)處理14.1使用剪貼板GetText和SetText方法,用來傳送文本。GetData和SetData方法,用來傳送圖形。Clear方法,可以處理文本和圖形兩種格式。在Windows環(huán)境中有一個(gè)特殊的對(duì)象,它是用來暫時(shí)保存文本和圖形的;只要Windows操作系統(tǒng)在運(yùn)行,我們隨時(shí)都可以使用這個(gè)對(duì)象。這個(gè)對(duì)象就是我們現(xiàn)在要講的剪貼板。VisualBasic中的Clipboard對(duì)象提供了訪問系統(tǒng)資源剪貼板的方法。Clipboard對(duì)象用于操作剪貼板上的文本和圖形,它使我們能夠復(fù)制、剪切和粘貼應(yīng)用程序中的文本和圖形。Clipboard對(duì)象沒有屬性和事件,只有幾個(gè)與環(huán)境剪貼板往返傳送數(shù)據(jù)的方法。這些方法分別是:剪貼板中可以有多段數(shù)據(jù),每段數(shù)據(jù)格式不同。比如,我們可以用SetData方法把一個(gè)圖形的信息以位圖格式存放到剪貼板中去,然后再用SetText方法把一串字符串存放到剪貼板中。接下來我們就可以用GetText方法來獲得剪貼板中的字符文字信息,用GetData方法來獲得剪貼板中的圖形信息。14.1.1使用剪貼板處理文字在處理文字時(shí),Clipboard對(duì)象使用的方法是SetText和GetText。我們可以使用這兩個(gè)方法向Clipboard發(fā)送字符串?dāng)?shù)據(jù)和從Clipboard接收字符串?dāng)?shù)據(jù),其操作過程如下圖所示。用SetText和GetText方法向剪貼板和從剪貼板傳送數(shù)據(jù)SetText方法將文本字符串?dāng)?shù)據(jù)發(fā)送到Clipboard上,替換先前存放在那里的文本。其語法如下所示:GetText方法的作用是返回當(dāng)前存儲(chǔ)在Clipboard內(nèi)的字符串?dāng)?shù)據(jù),我們也可以把它當(dāng)作一個(gè)函數(shù)來使用。除了SetText和GetText兩個(gè)方法外,我們?cè)谑褂肅lipboard對(duì)象進(jìn)行文本處理時(shí)還經(jīng)常會(huì)用到Clipboard對(duì)象的Clear方法,該方法的作用是清除已經(jīng)存儲(chǔ)在Clipboard內(nèi)的文字或圖形數(shù)據(jù),其語法如下:了解了Clipboard對(duì)象以上三個(gè)方法后,我們就可以輕松的編寫出類似于“記事本”應(yīng)用程序的“復(fù)制”、“剪切”與“粘貼”等菜單命令。DimdataAsString:Clipboard.SetTextdataDimdestinationAsStringdestination=Clipboard.GetTextClipboard.Clear例14.1建立如下圖所示的菜單應(yīng)用程序,圖中文本框Name屬性為:Text1,分別以mnuCopy、mnuCut、mnuPaste和mnuClear為“編輯”菜單下的“復(fù)制”、“剪切”、“粘貼”和“清空剪貼板”四個(gè)子菜單命名。剪貼板應(yīng)用演示程序編寫以下代碼,就可以實(shí)現(xiàn)上面提到的4個(gè)功能。Rem“復(fù)制”命令的實(shí)現(xiàn)PrivateSubmunCopy_Click()Clipboard.Clear '清空剪貼板中原有的數(shù)據(jù)Clipboard.SetTextText1.SelText '將文本框Text1內(nèi)被選中的字符串發(fā)送到剪貼板EndSub

Rem“剪切”命令的實(shí)現(xiàn)PrivateSubmnuCut_Click()Clipboard.ClearClipboard.SetTextText1.SelTextText1.SelText="" '復(fù)制后刪除文本框Text1內(nèi)被選中的文字EndSubRem“粘貼”命令的實(shí)現(xiàn)PrivateSubmnuPaste_Click()Text1.SelText=Clipboard.GetText '把剪貼板內(nèi)的文字信息發(fā)送到文本框當(dāng)前位置EndSub

Rem“清空剪貼板”命令的實(shí)現(xiàn)PrivateSubmnuClear_Click()Clipboard.ClearEndSub14.1.2在剪貼板上使用圖形格式Windows的剪貼板支持不同格式的幾塊數(shù)據(jù)同時(shí)存放在Clipboard上。其中,Clipboard的GetData和SetData方法允許處理圖形數(shù)據(jù)格式。類似于SetText方法,SetData方法的作用是將記載圖形信息的二進(jìn)制數(shù)據(jù)發(fā)送到Clipboard上,替換先前存放在那里的相應(yīng)格式的數(shù)據(jù)。其語法如下所示:同樣,類似于GetText方法,GetData方法的作用是返回當(dāng)前存儲(chǔ)在Clipboard內(nèi)的圖形數(shù)據(jù)。我們也可以把它當(dāng)作一個(gè)函數(shù)來使用,其語法如下:知道了Clipboard對(duì)象的以上兩種方法后,我們就可以像復(fù)制字符串一樣去復(fù)制圖形數(shù)據(jù)。下面就以一個(gè)簡(jiǎn)單的圖形復(fù)制程序?yàn)槔?,向大家介紹Clipboard對(duì)象的SetData與GetData兩種方法的應(yīng)用方式。Clipboard.SetDataPicture1.Picture'假定當(dāng)前工程中有一圖片框?qū)ο驪icture1。Picture1.Picture=Clipboard.GetData()例14.2建立如下圖所示的應(yīng)用程序,圖中左側(cè)圖片框Name屬性為:Picture1,右側(cè)圖片框Name屬性為:Picture2;標(biāo)題為“剪切”的命令按鈕的Name屬性為:Command1,標(biāo)題為“粘貼”的命令按鈕的Name屬性為:Command2,并且向圖片框Picture1內(nèi)添加一個(gè)圖形。使用剪貼板處理圖形數(shù)據(jù)演示程序編寫以下代碼,實(shí)現(xiàn)上面兩個(gè)命令按鈕的功能。PrivateSubForm_Load()Command1.Enabled=TrueCommand2.Enabled=False '程序運(yùn)行時(shí)禁用粘貼命令以免發(fā)生邏輯錯(cuò)誤EndSub

PrivateSubCommand1_Click()Clipboard.Clear'清除剪貼板內(nèi)原有數(shù)據(jù)Clipboard.SetDataPicture1.Picture'將圖片框Picture1的圖像數(shù)據(jù)裝入剪貼板Picture1.Picture=LoadPicture("")'清除圖片框Picture1的圖像Command1.Enabled=False'禁用剪切命令以免發(fā)生邏輯錯(cuò)誤Command2.Enabled=True'啟用粘貼命令EndSubPrivateSubCommand2_Click()Picture2.Picture=Clipboard.GetData'將剪貼板上的圖形數(shù)據(jù)裝入Picture2圖片框MsgBox"圖形剪貼板演示程序完成",vbOKOnly,"演示結(jié)束"EndEndSub在以上程序的注釋語句中已經(jīng)詳細(xì)說明了使用Cilpboard對(duì)象處理圖形數(shù)據(jù)的方法,望讀者詳細(xì)閱讀。14.2激活其他Windows應(yīng)用程序前面曾經(jīng)提到過,Windows環(huán)境下的應(yīng)用程序并不象DOS時(shí)代用C語言編制出的“程序孤島”,而是Windows環(huán)境下的動(dòng)態(tài)組成部分。因此,Windows環(huán)境下運(yùn)行的應(yīng)用程序在其自身運(yùn)行時(shí)往往還需要激活其他應(yīng)用程序,甚至還要能夠發(fā)送一些鍵盤消息來控制其他應(yīng)用程序的執(zhí)行。因此,VisualBasic為我們提供了以下幾種語句來完成上面提到的程序功能,其中包括:Shell、AppActivate和SendKeys三個(gè)函數(shù)(語句)。14.2.1使用Shell函數(shù)前面章節(jié)中曾經(jīng)介紹過,VisualBasic可以定義和調(diào)用自己的程序過程。實(shí)際上,在VB中我們不僅可以調(diào)用通用過程,而且還可以調(diào)用其他的應(yīng)用程序。這一功能是通過Shell函數(shù)實(shí)現(xiàn)的,其語法形式如下:Shell函數(shù)的語法解釋如下:(1)X為一個(gè)Double類型變量,用來接收Shell函數(shù)的返回值。如果Shell函數(shù)成功的運(yùn)行了指定的可執(zhí)行程序,它將返回該程序的任務(wù)ID。任務(wù)ID是一個(gè)唯一的數(shù)值,用來標(biāo)識(shí)駐留在內(nèi)存中(既正在運(yùn)行)的程序。如果Shell函數(shù)沒用順利打開指定的可執(zhí)行程序,則會(huì)產(chǎn)生錯(cuò)誤。(2)FilePath為必選參數(shù),是字符串型的變量或常量,用來指定要執(zhí)行的應(yīng)用程序的文件名(包括文件路徑),且該程序必須是可執(zhí)行文件。也就是說,其擴(kuò)展名稱必須為.COM、.EXE、.BAT或.PIF,其他文件不能使用Shell函數(shù)對(duì)其調(diào)用。此外,我們還可以在FilePath參數(shù)中加上調(diào)用的應(yīng)用程序的執(zhí)行參數(shù)或命令行變量。X=Shell(FilePath[,WindowStyle])(3)WindowStyle為可選參數(shù),是整型變量或常量,用來設(shè)定被調(diào)用的應(yīng)用程序在運(yùn)行時(shí)窗口的風(fēng)格。若省略,被調(diào)用程序以具有焦點(diǎn)的最小化窗口來執(zhí)行。WindowStyle參數(shù)的可選值與其對(duì)應(yīng)的常量如下表所示。常量值描述vbHide0窗口被隱藏,且具有焦點(diǎn)vbNormalFocus1窗口呈正常大小顯示,且具有焦點(diǎn)vbMinimizedNoFocus2窗口呈最小化顯示,且具有焦點(diǎn)vbMaximizedFocus3窗口呈最大化顯示,且具有焦點(diǎn)。vbNormalNoFocus4窗口不具有焦點(diǎn),且呈正常大小顯示vbMinimizedNoFocus6窗口不具有焦點(diǎn),且呈最小化顯示W(wǎng)indowStyle參數(shù)的可選值與其對(duì)應(yīng)的常量例14.3

編寫如圖14-4所示程序,用Shell函數(shù)調(diào)用其他應(yīng)用程序。此處假定該程序中包含有4個(gè)命令按鈕對(duì)象Command1~Command4,它們的Caption屬性分別為:“記事本程序”、“畫筆程序”、“計(jì)算器程序”和“退出”。Shell函數(shù)演示程序編寫以下代碼,實(shí)現(xiàn)上面程序的各項(xiàng)功能。PrivateDeclareFunctionGetWindowsDirectoryLib"kernel32"_Alias"GetWindowsDirectoryA"(ByVallpBufferAsString,_ByValnSizeAsLong)AsLongRem以上代碼的作用是聲明一個(gè)API函數(shù),該函數(shù)的作用是獲取Windows目錄的路徑。

DimWinPathAsString,filePathAsStringPrivateSubForm_Load()DimxAsLongWinPath=Space$(200)x=GetWindowsDirectory(WinPath,200)WinPath=Left(WinPath,x)+"\"EndSubPrivateSubCommand1_Click()filePath=WinPath+"notepad.exe"ID1=Shell(filePath,vbNormalFocus)EndSub

PrivateSubCommand2_Click()filePath=WinPath+"Pbrush.exe"ID2=Shell(filePath,vbNormalFocus)EndSubPrivateSubCommand3_Click()filePath=WinPath+"Calc.exe"ID3=Shell(filePath,vbNormalFocus)EndSub

PrivateSubCommand4_Click()EndEndSub上面是窗體對(duì)象和命令按鈕的事件過程。在窗體對(duì)象的Load事件過程中調(diào)用API函數(shù)(GetWindowsDirectory)得到當(dāng)前Windows操作系統(tǒng)目錄的路徑,并將其保存在模塊級(jí)變量WinPath內(nèi),然后在每個(gè)命令按鈕的Click事件過程中,在WinPath變量后連接上連接上相應(yīng)的應(yīng)用程序的文件名,得到該應(yīng)用程序完整的路徑名稱,并將其存放在變量filePath內(nèi),接著利用Shell函數(shù)去調(diào)用filePath變量指定的應(yīng)用程序。14.2.2使用AppActivate語句使用AppActivate語句,可以將程序焦點(diǎn)從當(dāng)前應(yīng)用程序轉(zhuǎn)移到Windows環(huán)境中正在運(yùn)行的其他程序上。其語法如下:AppActivate語句的語法解釋如下:(1)Title必選參數(shù),數(shù)據(jù)類型為字符串型或Double型,字符串的內(nèi)容是需要激活的應(yīng)用程序窗口的標(biāo)題。也可以使用Shell函數(shù)返回的Double型任務(wù)標(biāo)識(shí)碼來代替title字符串,以激活應(yīng)用程序。(2)Wait可選參數(shù),Boolean型,該參數(shù)是用來說明在激活另一個(gè)應(yīng)用程序之前調(diào)用的應(yīng)用程序是否有焦點(diǎn)。如果為False(默認(rèn)值),那么即使調(diào)用的應(yīng)用程序沒有焦點(diǎn),也直接激活指定的應(yīng)用程序。如果為True,則調(diào)用的應(yīng)用程序會(huì)到自己再次得到焦點(diǎn)后,才激活指定的應(yīng)用程序。AppActivatetitle[,wait]下面幾句代碼簡(jiǎn)單說明了如何使用AppActivate語句。其中,例子中用到的Shell函數(shù)均假定被調(diào)用的應(yīng)用程序已經(jīng)存在于指定的路徑中。DimIDAsLongAppActivate"MicrosoftWord"'激活Word應(yīng)用程序。

'AppActivate語句也可以利用Shell函數(shù)的返回值作為參數(shù),來激活應(yīng)用程序。ID=Shell("c:\windows\notepad.exe",vbNormalNoFocus)AppActivateID14.2.3使用SendKeys語句向其他程序發(fā)送消息使用SendKeys語句,可將一個(gè)或多個(gè)按鍵消息發(fā)送到活動(dòng)窗口,就如同有人從鍵盤上輸入了這些消息一樣,從而達(dá)到對(duì)其他應(yīng)用程序進(jìn)行信息輸入或控制的目的。SendKeys語句的語法如下:SendKeys語句的語法具有以下兩個(gè)命令參數(shù),如下表所示。SendKeysMsgString[,wait]參數(shù)描述MsgString字符串型,為必選參數(shù),指定要發(fā)送的按鍵消息Wait可選參數(shù),用于指定等待的方式。如果為False(缺省值),則在按鍵消息發(fā)送出去之后立刻返回到過程。如果為True,則SendKeys語句會(huì)等接收消息的程序處理完上一個(gè)消息后,才發(fā)送第二個(gè)消息到指定程序去Sendkeys語句的參數(shù)說明:MsgString參數(shù)是由一個(gè)或多個(gè)字符組成的字符串,如果要發(fā)送單一的鍵盤信息,則該參數(shù)的字符串內(nèi)容為該字符本身。例如,為了表示字母A,可用"A"作為MsgString。為了表示多個(gè)字符組成的鍵盤消息,就必須在前面的字符后面直接加上下一個(gè)字符。例如,要表示A、B及C,可用"ABC"作為MsgString參數(shù)。對(duì)SendKeys語句來說,加號(hào)“+”、插入符“^”、百分號(hào)“%”、上劃線“~”及圓括號(hào)“()”都具有特殊意義。為了指定上述任何一個(gè)字符,都要將其放入大括號(hào)“{}”內(nèi)。例如,要指定加號(hào),可用“{+}”表示。同樣為了使用大括號(hào)字符,也要使用“{{}”及“{}}”。為了發(fā)送那些不顯示的字符到其他應(yīng)用程序,例如Enter或Backspace等表示動(dòng)做的而不是顯示字符的按鍵,都要使用下表所列出的代碼。按鍵動(dòng)作代碼按鍵動(dòng)作代碼Backspace{BACKSPACE}、{BS}或{BKSP}PageUp{PGUP}Break{BREAK}ScrollLock{SCROLLLOCK}CapsLock{CAPSLOCK}Tab{TAB}DelorDelete{DELETE}或{DEL}F1{F1}↓{DOWN}F2{F2}←{LEFT}F3{F3}↑{UP}F4{F4}→{RIGHT}F5{F5}End{END}F6{F6}Enter{ENTER}或{~}F7{F7}Esc{ESC}F8{F8}Help{HELP}F9{F9}Home{HOME}F10{F10}Insert{INSERT}F11{F11}NumLock{NUMLOCK}F12{F12}PageDown{PGDN}SendKeys語句中動(dòng)作按鍵的代碼熟悉Windows操作的讀者都知道,我們?cè)赪indows環(huán)境下使用各種應(yīng)用程序時(shí)都不免會(huì)使用功能鍵Shift、Ctrl及Alt等來輔助操作。因此SendKeys語句為了控制其他程序也需要能夠發(fā)送這些功能鍵信息。這些功能的代碼如下表所示。按

鍵代

碼SHIFT+CTRL^ALT%功能鍵代碼表為了說明使用SendKeys語句發(fā)送組合鍵的方法特對(duì)以下幾句VB語句加以說明:除了以上功能SendKeys語句還可以將單個(gè)按鍵信息重復(fù)多次發(fā)送到指定的應(yīng)用程序上去其形式為:{Keynumber}。使用時(shí)必須在Key與number之間加一個(gè)空格。例如:

下面給出兩個(gè)例子來演示SendKeys語句的作用。SendKeys"+E"'代表發(fā)送按下Shift+E鍵SendKeys"^%P"'代表發(fā)送按下Ctrl+Alt+P鍵SendKeys"%{F4}"'代表發(fā)送Alt+F4鍵SendKeys"%(DF)"'代表發(fā)送按下Alt的同時(shí)還按下D鍵和F鍵SendKeys"%DF"'代表發(fā)送按下Alt的同時(shí)還按下D鍵,然后又按下F鍵SendKeys"{a20}"'發(fā)送20個(gè)a到指定程序。例14.4

如下圖所示建立一個(gè)單窗體工程,向窗體Form1上添加一個(gè)Name屬性為Command1,Caption屬性為“演示SendKeys”的命令按鈕。在Command1對(duì)象的單擊事件中,使用Shell函數(shù)來運(yùn)行微軟Windows操作系統(tǒng)所附的記事本程序,然后使用SendKeys語句向被激活的記事本程序中發(fā)送指定的字符串信息。要求在記事本程序上顯示字符串信息“HelloWorld!”,然后換一行顯示20個(gè)由A組成的字符串。SendKeys演示程序一其程序如下。PrivateDeclareFunctionGetWindowsDirectoryLib"kernel32"_Alias"GetWindowsDirectoryA"(ByVallpBufferAsString,_ByValnSizeAsLong)AsLongRem以上代碼的作用是聲明一個(gè)API函數(shù),該函數(shù)的作用是獲取Windows目錄的路徑。

DimWinPathAsString,filePathAsStringPrivateSubForm_Load()DimxAsLongWinPath=Space$(200)x=GetWindowsDirectory(WinPath,200)WinPath=Left(WinPath,x)+"\"EndSubPrivateSubCommand1_Click()filePath=WinPath+"notepad.exe"ID1=Shell(filePath,vbNormalFocus)SendKeys"HelloWorld!!"SendKeys"{ENTER}"SendKeys"{A20}"EndSub其運(yùn)行結(jié)果如下圖所示。例14.4運(yùn)行結(jié)果例14.5

建立如下圖所示工程,在命令按鈕對(duì)象的單擊事件中,使用Shell函數(shù)來運(yùn)行微軟Windows操作系統(tǒng)所附的應(yīng)用軟件計(jì)算器本程序,然后使用SendKeys語句控制計(jì)算器去計(jì)算從1一直加到100的加法運(yùn)算,要求得到計(jì)算結(jié)果。SendKeys演示程序二PrivateDeclareFunctionGetWindowsDirectoryLib"kernel32"_Alias"GetWindowsDirectoryA"(ByVallpBufferAsString,_ByValnSizeAsLong)AsLongRem以上代碼的作用是聲明一個(gè)API函數(shù),該函數(shù)的作用是獲取Windows目錄的路徑。DimWinPathAsString,filePathAsStringPrivateSubForm_Load()DimxAsLongWinPath=Space$(200)x=GetWindowsDirectory(WinPath,200)WinPath=Left(WinPath,x)+"\"EndSubPrivateSubCommand1_Click()filePath=WinPath+"Calc.exe"ID1=Shell(filePath,vbNormalFocus)SendKeys"%VS",True'將計(jì)算器程序轉(zhuǎn)換到科學(xué)型計(jì)算器樣式Fori=1To99SendKeysCStr(i)&"{+}",TrueNextiSendKeys"100=",TrueEndSub本程序運(yùn)行結(jié)果如右圖所示。例14.5運(yùn)行結(jié)果14.3中斷和后臺(tái)處理什么是中斷?簡(jiǎn)單地說,中斷是一個(gè)“過程”。這一過程一般是由計(jì)算機(jī)的硬件或軟件引起的,即CPU暫時(shí)中止現(xiàn)行程序的執(zhí)行,轉(zhuǎn)去執(zhí)行其他程序,待處理完畢后又回到被中止了的程序這樣一個(gè)過程。在Windows環(huán)境的操作過程中,與中斷這一概念連接的最緊密的概念就是后臺(tái)處理這種程序運(yùn)行機(jī)制了。請(qǐng)讀者試運(yùn)行以下程序:例14.6PrivateSubForm_Click()DimxAsDoublePrintNow()x=1Fori=1To100000000'作1億次浮點(diǎn)乘法運(yùn)算x=i*3.1415926NextiPrintxPrintNow()EndSub該程序在窗體對(duì)象的單擊事件中,進(jìn)行了1億次的浮點(diǎn)乘法運(yùn)算。讀者在運(yùn)行該程序時(shí)會(huì)非常明顯的感覺到,程序運(yùn)行時(shí)的停頓。作者在CPU主頻率1.8GHz的奔騰4上運(yùn)行該程序的單擊事件??偣蚕?8秒左右的時(shí)間,其運(yùn)行結(jié)果如下圖所示。細(xì)心的讀者會(huì)發(fā)現(xiàn)在程序運(yùn)行到1億次浮點(diǎn)乘法運(yùn)算的停頓時(shí)我們將無法再對(duì)該程序進(jìn)行操作,甚至無法用鼠標(biāo)移動(dòng)該窗體對(duì)象到其他位置。這是因?yàn)閃indows是搶先式多任務(wù)操作系統(tǒng),而例14.6程序中For循環(huán)語句所造成的1億次浮點(diǎn)乘法運(yùn)算,大量搶占了處理器的運(yùn)算資源,從而造所了無法響應(yīng)其他事件的結(jié)果。為了使程序在進(jìn)行多次循環(huán),大時(shí)間片運(yùn)算時(shí)還能正常響應(yīng)其他事件,在VisualBasic編程技術(shù)中有使用定時(shí)器控件和DoEvents()語句兩種常用技巧。例14.6運(yùn)行結(jié)果14.3.1使用定時(shí)器控件進(jìn)行后臺(tái)處理在前面章節(jié)中我們已經(jīng)掌握了如何使用定時(shí)器控件。只是還沒有掌握使用它進(jìn)行后臺(tái)程序處理的思想,本節(jié)中就一起來討論如何運(yùn)用這種技巧。把后臺(tái)任務(wù)代碼放入Timer事件中,用全局、模塊或靜態(tài)變量存儲(chǔ)Timer事件過程中必須一直保存的變量。當(dāng)Timer事件獲得控制權(quán)后,使其運(yùn)行事件時(shí)間稍大于Interval屬性指定的時(shí)間,這將確保后臺(tái)任務(wù)能夠充分利用系統(tǒng)分配的時(shí)間片。為定時(shí)器控件的Interval屬性設(shè)置較大的值,這將使處理更為有效。充分搶先式多任務(wù)操作系統(tǒng)的特點(diǎn),能夠防止其他應(yīng)用程序被阻塞。而且在取消長(zhǎng)時(shí)間任務(wù)時(shí),用戶通常也能夠容忍短暫的延遲。如果在編制多線程任務(wù)時(shí),最好能以定時(shí)器控件的Enabled屬性為標(biāo)志,防止其他線程再次啟動(dòng)已經(jīng)運(yùn)行的后臺(tái)任務(wù)。例14.7

建立圖一個(gè)單窗體工程,向工程中添加一個(gè)定時(shí)器控件(Timer1)和一個(gè)圖像框控件(Image1),然后在代碼窗口中編寫以下程序,DimNowXAsInteger'定義窗體模塊變量NowX

PrivateSubForm_Load()Timer1.Interval=65'App.Path系統(tǒng)變量,用來記載當(dāng)前程序所在路徑名稱m=App.Path&"\1.jpg"Image1.Picture=LoadPicture(m)Image1.Top=0Image1.Left=0Form1.Width=Image1.WidthEndSubPrivateSubTimer1_Timer()Image1.MoveImage1.Left,Image1.Top-30IfImage1.Top+Image1.Height<=Form1.HeightThenNowX=NowX+1'NowX窗體模塊級(jí)變量用來保存下一個(gè)將被'顯示的圖片的主文件名m=App.Path&"\"&CStr(NowX)&".jpg"Image1.Picture=LoadPicture(m)Form1.Width=Image1.WidthImage1.RefreshImage1.Top=0IfNowX>=4ThenNowX=0EndIfEndSub本程序運(yùn)行時(shí),要保證程序文件所在目錄內(nèi)有4個(gè)圖形文件,文件名分別為1.jpg、2.jpg、3.jpg和4.jpg,并且每個(gè)圖片的高度都要大于本程序中窗體對(duì)象的高度。在以上條件被滿足時(shí)運(yùn)行該程序會(huì)實(shí)現(xiàn)這樣的程序功能:在一定的時(shí)間間隔,圖形向上移動(dòng),當(dāng)一個(gè)圖形的全部?jī)?nèi)容都被顯示后,再換下一個(gè)圖形。當(dāng)4個(gè)圖形都顯示完以后,再從1.jpg圖片重新顯示。在本程序運(yùn)行時(shí),我們可以使用鼠標(biāo)拖拽該程序窗口進(jìn)行移動(dòng)。這代表操作系統(tǒng)除了本程序中響應(yīng)定時(shí)器對(duì)象的Timer事件外,還可以響應(yīng)其他操作。也就是說,系統(tǒng)中其他程序沒有因?yàn)檫\(yùn)行當(dāng)前程序而被阻塞。從而達(dá)到了進(jìn)行后臺(tái)操作的目的。14.3.2使用DoEvents語句進(jìn)行后臺(tái)處理盡管定時(shí)器控件是進(jìn)行后臺(tái)處理很好的工具,但是我們還有更加專業(yè)一些的方法,那就是DoEvents語句。VisualBasic中DoEvents語句的作用是暫時(shí)把控制權(quán)交還給Windows操作系統(tǒng),以便讓操作系統(tǒng)處理其他事件。DoEvents語句的語法如下:DoEvents讓我們對(duì)例14.6進(jìn)行一些改變,得到以下程序:例14.8PrivateSubForm_Click()DimxAsDoublePrintNow()x=1Fori=1To1000000'作100萬次浮點(diǎn)乘法運(yùn)算x=i*3.1415926DoEvents'把控制權(quán)交還給操作系統(tǒng),允許系統(tǒng)響應(yīng)其他事件。NextiPrintxPrintNow()EndSub前面章節(jié)中我們看到了,當(dāng)例14.6程序運(yùn)行時(shí),我們甚至不能用鼠標(biāo)移動(dòng)其窗體對(duì)象到其他位置。但是在我們向例14.6程序的For循環(huán)語句中加上了DoEvents語句后,在該程序運(yùn)行時(shí)我們就可以用鼠標(biāo)移動(dòng)其窗體對(duì)象。這是因?yàn)镈oEvents語句把控制權(quán)交還給操作系統(tǒng),允許Windows系統(tǒng)響應(yīng)其他事件。因此,我們用鼠標(biāo)移動(dòng)其窗體對(duì)象的操作自然會(huì)被響應(yīng)??墒羌?xì)心的讀者會(huì)發(fā)現(xiàn),為什么要把例14.6程序中1億次循環(huán)浮點(diǎn)乘法運(yùn)算,給變成例14.8程序中100萬次循環(huán)浮點(diǎn)乘法運(yùn)算呢?其實(shí)在我們看完其運(yùn)算結(jié)果后,這個(gè)疑問自然會(huì)被解開的。下圖顯示了作者的電腦運(yùn)行例14.8的結(jié)果。我們會(huì)發(fā)現(xiàn),在For循環(huán)中加上了DoEvents語句后,進(jìn)行100萬次浮點(diǎn)乘法運(yùn)算居然需要8秒鐘的時(shí)間。而如果去掉DoEvents語句,如例14.6程序運(yùn)行結(jié)果,進(jìn)行1億次浮點(diǎn)乘法運(yùn)算所消毫的時(shí)間也只有18秒左右。這也說明了,雖然DoEvents語句允許操作系統(tǒng)響應(yīng)其他事件的操作,但是這是以大量消耗程序運(yùn)行速度為代價(jià)的。運(yùn)行結(jié)果因此在讀者使用DoEvents語句時(shí),一定要慎重考慮在你的程序中使用它是否合適,會(huì)不會(huì)大規(guī)模的降低我們程序的處理效率。那么有沒有一種比較折中的辦法,讓程序既能響應(yīng)操作系統(tǒng)的其他操作,同時(shí)又能夠以較高的效率來進(jìn)行后臺(tái)處理,回答當(dāng)然是肯定的。其實(shí)這只是一種編程的技巧,我們可以把例14.6作進(jìn)一步的改變。其改變后的程序代碼如例14.9所示。例14.9PrivateSubForm_Click()DimxAsDoublePrintNow()x=1Forj=1To1000'外循環(huán)總共循環(huán)了1000次Fori=1To100000'每次內(nèi)部循環(huán)執(zhí)行10萬次浮點(diǎn)乘法運(yùn)算x=i*3.1415926NextIDoEvents'把控制權(quán)交還給操作系統(tǒng),允許系統(tǒng)響應(yīng)其他事件。Nextj'最終我們共執(zhí)行了1億次浮點(diǎn)乘法運(yùn)算PrintxPrintNow()EndSub該程序運(yùn)行結(jié)果如下圖所示。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論