




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第14章
操作Windows環(huán)境使用剪貼板激活其他Windows應(yīng)用程序中斷和后臺處理14.1使用剪貼板GetText和SetText方法,用來傳送文本。GetData和SetData方法,用來傳送圖形。Clear方法,可以處理文本和圖形兩種格式。在Windows環(huán)境中有一個特殊的對象,它是用來暫時保存文本和圖形的;只要Windows操作系統(tǒng)在運行,我們隨時都可以使用這個對象。這個對象就是我們現(xiàn)在要講的剪貼板。VisualBasic中的Clipboard對象提供了訪問系統(tǒng)資源剪貼板的方法。Clipboard對象用于操作剪貼板上的文本和圖形,它使我們能夠復(fù)制、剪切和粘貼應(yīng)用程序中的文本和圖形。Clipboard對象沒有屬性和事件,只有幾個與環(huán)境剪貼板往返傳送數(shù)據(jù)的方法。這些方法分別是:剪貼板中可以有多段數(shù)據(jù),每段數(shù)據(jù)格式不同。比如,我們可以用SetData方法把一個圖形的信息以位圖格式存放到剪貼板中去,然后再用SetText方法把一串字符串存放到剪貼板中。接下來我們就可以用GetText方法來獲得剪貼板中的字符文字信息,用GetData方法來獲得剪貼板中的圖形信息。14.1.1使用剪貼板處理文字在處理文字時,Clipboard對象使用的方法是SetText和GetText。我們可以使用這兩個方法向Clipboard發(fā)送字符串數(shù)據(jù)和從Clipboard接收字符串數(shù)據(jù),其操作過程如下圖所示。用SetText和GetText方法向剪貼板和從剪貼板傳送數(shù)據(jù)SetText方法將文本字符串數(shù)據(jù)發(fā)送到Clipboard上,替換先前存放在那里的文本。其語法如下所示:GetText方法的作用是返回當前存儲在Clipboard內(nèi)的字符串數(shù)據(jù),我們也可以把它當作一個函數(shù)來使用。除了SetText和GetText兩個方法外,我們在使用Clipboard對象進行文本處理時還經(jīng)常會用到Clipboard對象的Clear方法,該方法的作用是清除已經(jīng)存儲在Clipboard內(nèi)的文字或圖形數(shù)據(jù),其語法如下:了解了Clipboard對象以上三個方法后,我們就可以輕松的編寫出類似于“記事本”應(yīng)用程序的“復(fù)制”、“剪切”與“粘貼”等菜單命令。DimdataAsString:Clipboard.SetTextdataDimdestinationAsStringdestination=Clipboard.GetTextClipboard.Clear例14.1建立如下圖所示的菜單應(yīng)用程序,圖中文本框Name屬性為:Text1,分別以mnuCopy、mnuCut、mnuPaste和mnuClear為“編輯”菜單下的“復(fù)制”、“剪切”、“粘貼”和“清空剪貼板”四個子菜單命名。剪貼板應(yīng)用演示程序編寫以下代碼,就可以實現(xiàn)上面提到的4個功能。Rem“復(fù)制”命令的實現(xiàn)PrivateSubmunCopy_Click()Clipboard.Clear '清空剪貼板中原有的數(shù)據(jù)Clipboard.SetTextText1.SelText '將文本框Text1內(nèi)被選中的字符串發(fā)送到剪貼板EndSub
Rem“剪切”命令的實現(xiàn)PrivateSubmnuCut_Click()Clipboard.ClearClipboard.SetTextText1.SelTextText1.SelText="" '復(fù)制后刪除文本框Text1內(nèi)被選中的文字EndSubRem“粘貼”命令的實現(xiàn)PrivateSubmnuPaste_Click()Text1.SelText=Clipboard.GetText '把剪貼板內(nèi)的文字信息發(fā)送到文本框當前位置EndSub
Rem“清空剪貼板”命令的實現(xiàn)PrivateSubmnuClear_Click()Clipboard.ClearEndSub14.1.2在剪貼板上使用圖形格式Windows的剪貼板支持不同格式的幾塊數(shù)據(jù)同時存放在Clipboard上。其中,Clipboard的GetData和SetData方法允許處理圖形數(shù)據(jù)格式。類似于SetText方法,SetData方法的作用是將記載圖形信息的二進制數(shù)據(jù)發(fā)送到Clipboard上,替換先前存放在那里的相應(yīng)格式的數(shù)據(jù)。其語法如下所示:同樣,類似于GetText方法,GetData方法的作用是返回當前存儲在Clipboard內(nèi)的圖形數(shù)據(jù)。我們也可以把它當作一個函數(shù)來使用,其語法如下:知道了Clipboard對象的以上兩種方法后,我們就可以像復(fù)制字符串一樣去復(fù)制圖形數(shù)據(jù)。下面就以一個簡單的圖形復(fù)制程序為例,向大家介紹Clipboard對象的SetData與GetData兩種方法的應(yīng)用方式。Clipboard.SetDataPicture1.Picture'假定當前工程中有一圖片框?qū)ο驪icture1。Picture1.Picture=Clipboard.GetData()例14.2建立如下圖所示的應(yīng)用程序,圖中左側(cè)圖片框Name屬性為:Picture1,右側(cè)圖片框Name屬性為:Picture2;標題為“剪切”的命令按鈕的Name屬性為:Command1,標題為“粘貼”的命令按鈕的Name屬性為:Command2,并且向圖片框Picture1內(nèi)添加一個圖形。使用剪貼板處理圖形數(shù)據(jù)演示程序編寫以下代碼,實現(xiàn)上面兩個命令按鈕的功能。PrivateSubForm_Load()Command1.Enabled=TrueCommand2.Enabled=False '程序運行時禁用粘貼命令以免發(fā)生邏輯錯誤EndSub
PrivateSubCommand1_Click()Clipboard.Clear'清除剪貼板內(nèi)原有數(shù)據(jù)Clipboard.SetDataPicture1.Picture'將圖片框Picture1的圖像數(shù)據(jù)裝入剪貼板Picture1.Picture=LoadPicture("")'清除圖片框Picture1的圖像Command1.Enabled=False'禁用剪切命令以免發(fā)生邏輯錯誤Command2.Enabled=True'啟用粘貼命令EndSubPrivateSubCommand2_Click()Picture2.Picture=Clipboard.GetData'將剪貼板上的圖形數(shù)據(jù)裝入Picture2圖片框MsgBox"圖形剪貼板演示程序完成",vbOKOnly,"演示結(jié)束"EndEndSub在以上程序的注釋語句中已經(jīng)詳細說明了使用Cilpboard對象處理圖形數(shù)據(jù)的方法,望讀者詳細閱讀。14.2激活其他Windows應(yīng)用程序前面曾經(jīng)提到過,Windows環(huán)境下的應(yīng)用程序并不象DOS時代用C語言編制出的“程序孤島”,而是Windows環(huán)境下的動態(tài)組成部分。因此,Windows環(huán)境下運行的應(yīng)用程序在其自身運行時往往還需要激活其他應(yīng)用程序,甚至還要能夠發(fā)送一些鍵盤消息來控制其他應(yīng)用程序的執(zhí)行。因此,VisualBasic為我們提供了以下幾種語句來完成上面提到的程序功能,其中包括:Shell、AppActivate和SendKeys三個函數(shù)(語句)。14.2.1使用Shell函數(shù)前面章節(jié)中曾經(jīng)介紹過,VisualBasic可以定義和調(diào)用自己的程序過程。實際上,在VB中我們不僅可以調(diào)用通用過程,而且還可以調(diào)用其他的應(yīng)用程序。這一功能是通過Shell函數(shù)實現(xiàn)的,其語法形式如下:Shell函數(shù)的語法解釋如下:(1)X為一個Double類型變量,用來接收Shell函數(shù)的返回值。如果Shell函數(shù)成功的運行了指定的可執(zhí)行程序,它將返回該程序的任務(wù)ID。任務(wù)ID是一個唯一的數(shù)值,用來標識駐留在內(nèi)存中(既正在運行)的程序。如果Shell函數(shù)沒用順利打開指定的可執(zhí)行程序,則會產(chǎn)生錯誤。(2)FilePath為必選參數(shù),是字符串型的變量或常量,用來指定要執(zhí)行的應(yīng)用程序的文件名(包括文件路徑),且該程序必須是可執(zhí)行文件。也就是說,其擴展名稱必須為.COM、.EXE、.BAT或.PIF,其他文件不能使用Shell函數(shù)對其調(diào)用。此外,我們還可以在FilePath參數(shù)中加上調(diào)用的應(yīng)用程序的執(zhí)行參數(shù)或命令行變量。X=Shell(FilePath[,WindowStyle])(3)WindowStyle為可選參數(shù),是整型變量或常量,用來設(shè)定被調(diào)用的應(yīng)用程序在運行時窗口的風(fēng)格。若省略,被調(diào)用程序以具有焦點的最小化窗口來執(zhí)行。WindowStyle參數(shù)的可選值與其對應(yīng)的常量如下表所示。常量值描述vbHide0窗口被隱藏,且具有焦點vbNormalFocus1窗口呈正常大小顯示,且具有焦點vbMinimizedNoFocus2窗口呈最小化顯示,且具有焦點vbMaximizedFocus3窗口呈最大化顯示,且具有焦點。vbNormalNoFocus4窗口不具有焦點,且呈正常大小顯示vbMinimizedNoFocus6窗口不具有焦點,且呈最小化顯示W(wǎng)indowStyle參數(shù)的可選值與其對應(yīng)的常量例14.3
編寫如圖14-4所示程序,用Shell函數(shù)調(diào)用其他應(yīng)用程序。此處假定該程序中包含有4個命令按鈕對象Command1~Command4,它們的Caption屬性分別為:“記事本程序”、“畫筆程序”、“計算器程序”和“退出”。Shell函數(shù)演示程序編寫以下代碼,實現(xiàn)上面程序的各項功能。PrivateDeclareFunctionGetWindowsDirectoryLib"kernel32"_Alias"GetWindowsDirectoryA"(ByVallpBufferAsString,_ByValnSizeAsLong)AsLongRem以上代碼的作用是聲明一個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上面是窗體對象和命令按鈕的事件過程。在窗體對象的Load事件過程中調(diào)用API函數(shù)(GetWindowsDirectory)得到當前Windows操作系統(tǒng)目錄的路徑,并將其保存在模塊級變量WinPath內(nèi),然后在每個命令按鈕的Click事件過程中,在WinPath變量后連接上連接上相應(yīng)的應(yīng)用程序的文件名,得到該應(yīng)用程序完整的路徑名稱,并將其存放在變量filePath內(nèi),接著利用Shell函數(shù)去調(diào)用filePath變量指定的應(yīng)用程序。14.2.2使用AppActivate語句使用AppActivate語句,可以將程序焦點從當前應(yīng)用程序轉(zhuǎn)移到Windows環(huán)境中正在運行的其他程序上。其語法如下:AppActivate語句的語法解釋如下:(1)Title必選參數(shù),數(shù)據(jù)類型為字符串型或Double型,字符串的內(nèi)容是需要激活的應(yīng)用程序窗口的標題。也可以使用Shell函數(shù)返回的Double型任務(wù)標識碼來代替title字符串,以激活應(yīng)用程序。(2)Wait可選參數(shù),Boolean型,該參數(shù)是用來說明在激活另一個應(yīng)用程序之前調(diào)用的應(yīng)用程序是否有焦點。如果為False(默認值),那么即使調(diào)用的應(yīng)用程序沒有焦點,也直接激活指定的應(yīng)用程序。如果為True,則調(diào)用的應(yīng)用程序會到自己再次得到焦點后,才激活指定的應(yīng)用程序。AppActivatetitle[,wait]下面幾句代碼簡單說明了如何使用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語句,可將一個或多個按鍵消息發(fā)送到活動窗口,就如同有人從鍵盤上輸入了這些消息一樣,從而達到對其他應(yīng)用程序進行信息輸入或控制的目的。SendKeys語句的語法如下:SendKeys語句的語法具有以下兩個命令參數(shù),如下表所示。SendKeysMsgString[,wait]參數(shù)描述MsgString字符串型,為必選參數(shù),指定要發(fā)送的按鍵消息Wait可選參數(shù),用于指定等待的方式。如果為False(缺省值),則在按鍵消息發(fā)送出去之后立刻返回到過程。如果為True,則SendKeys語句會等接收消息的程序處理完上一個消息后,才發(fā)送第二個消息到指定程序去Sendkeys語句的參數(shù)說明:MsgString參數(shù)是由一個或多個字符組成的字符串,如果要發(fā)送單一的鍵盤信息,則該參數(shù)的字符串內(nèi)容為該字符本身。例如,為了表示字母A,可用"A"作為MsgString。為了表示多個字符組成的鍵盤消息,就必須在前面的字符后面直接加上下一個字符。例如,要表示A、B及C,可用"ABC"作為MsgString參數(shù)。對SendKeys語句來說,加號“+”、插入符“^”、百分號“%”、上劃線“~”及圓括號“()”都具有特殊意義。為了指定上述任何一個字符,都要將其放入大括號“{}”內(nèi)。例如,要指定加號,可用“{+}”表示。同樣為了使用大括號字符,也要使用“{{}”及“{}}”。為了發(fā)送那些不顯示的字符到其他應(yīng)用程序,例如Enter或Backspace等表示動做的而不是顯示字符的按鍵,都要使用下表所列出的代碼。按鍵動作代碼按鍵動作代碼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語句中動作按鍵的代碼熟悉Windows操作的讀者都知道,我們在Windows環(huán)境下使用各種應(yīng)用程序時都不免會使用功能鍵Shift、Ctrl及Alt等來輔助操作。因此SendKeys語句為了控制其他程序也需要能夠發(fā)送這些功能鍵信息。這些功能的代碼如下表所示。按
鍵代
碼SHIFT+CTRL^ALT%功能鍵代碼表為了說明使用SendKeys語句發(fā)送組合鍵的方法特對以下幾句VB語句加以說明:除了以上功能SendKeys語句還可以將單個按鍵信息重復(fù)多次發(fā)送到指定的應(yīng)用程序上去其形式為:{Keynumber}。使用時必須在Key與number之間加一個空格。例如:
下面給出兩個例子來演示SendKeys語句的作用。SendKeys"+E"'代表發(fā)送按下Shift+E鍵SendKeys"^%P"'代表發(fā)送按下Ctrl+Alt+P鍵SendKeys"%{F4}"'代表發(fā)送Alt+F4鍵SendKeys"%(DF)"'代表發(fā)送按下Alt的同時還按下D鍵和F鍵SendKeys"%DF"'代表發(fā)送按下Alt的同時還按下D鍵,然后又按下F鍵SendKeys"{a20}"'發(fā)送20個a到指定程序。例14.4
如下圖所示建立一個單窗體工程,向窗體Form1上添加一個Name屬性為Command1,Caption屬性為“演示SendKeys”的命令按鈕。在Command1對象的單擊事件中,使用Shell函數(shù)來運行微軟Windows操作系統(tǒng)所附的記事本程序,然后使用SendKeys語句向被激活的記事本程序中發(fā)送指定的字符串信息。要求在記事本程序上顯示字符串信息“HelloWorld!”,然后換一行顯示20個由A組成的字符串。SendKeys演示程序一其程序如下。PrivateDeclareFunctionGetWindowsDirectoryLib"kernel32"_Alias"GetWindowsDirectoryA"(ByVallpBufferAsString,_ByValnSizeAsLong)AsLongRem以上代碼的作用是聲明一個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其運行結(jié)果如下圖所示。例14.4運行結(jié)果例14.5
建立如下圖所示工程,在命令按鈕對象的單擊事件中,使用Shell函數(shù)來運行微軟Windows操作系統(tǒng)所附的應(yīng)用軟件計算器本程序,然后使用SendKeys語句控制計算器去計算從1一直加到100的加法運算,要求得到計算結(jié)果。SendKeys演示程序二PrivateDeclareFunctionGetWindowsDirectoryLib"kernel32"_Alias"GetWindowsDirectoryA"(ByVallpBufferAsString,_ByValnSizeAsLong)AsLongRem以上代碼的作用是聲明一個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'將計算器程序轉(zhuǎn)換到科學(xué)型計算器樣式Fori=1To99SendKeysCStr(i)&"{+}",TrueNextiSendKeys"100=",TrueEndSub本程序運行結(jié)果如右圖所示。例14.5運行結(jié)果14.3中斷和后臺處理什么是中斷?簡單地說,中斷是一個“過程”。這一過程一般是由計算機的硬件或軟件引起的,即CPU暫時中止現(xiàn)行程序的執(zhí)行,轉(zhuǎn)去執(zhí)行其他程序,待處理完畢后又回到被中止了的程序這樣一個過程。在Windows環(huán)境的操作過程中,與中斷這一概念連接的最緊密的概念就是后臺處理這種程序運行機制了。請讀者試運行以下程序:例14.6PrivateSubForm_Click()DimxAsDoublePrintNow()x=1Fori=1To100000000'作1億次浮點乘法運算x=i*3.1415926NextiPrintxPrintNow()EndSub該程序在窗體對象的單擊事件中,進行了1億次的浮點乘法運算。讀者在運行該程序時會非常明顯的感覺到,程序運行時的停頓。作者在CPU主頻率1.8GHz的奔騰4上運行該程序的單擊事件。總共消耗18秒左右的時間,其運行結(jié)果如下圖所示。細心的讀者會發(fā)現(xiàn)在程序運行到1億次浮點乘法運算的停頓時我們將無法再對該程序進行操作,甚至無法用鼠標移動該窗體對象到其他位置。這是因為Windows是搶先式多任務(wù)操作系統(tǒng),而例14.6程序中For循環(huán)語句所造成的1億次浮點乘法運算,大量搶占了處理器的運算資源,從而造所了無法響應(yīng)其他事件的結(jié)果。為了使程序在進行多次循環(huán),大時間片運算時還能正常響應(yīng)其他事件,在VisualBasic編程技術(shù)中有使用定時器控件和DoEvents()語句兩種常用技巧。例14.6運行結(jié)果14.3.1使用定時器控件進行后臺處理在前面章節(jié)中我們已經(jīng)掌握了如何使用定時器控件。只是還沒有掌握使用它進行后臺程序處理的思想,本節(jié)中就一起來討論如何運用這種技巧。把后臺任務(wù)代碼放入Timer事件中,用全局、模塊或靜態(tài)變量存儲Timer事件過程中必須一直保存的變量。當Timer事件獲得控制權(quán)后,使其運行事件時間稍大于Interval屬性指定的時間,這將確保后臺任務(wù)能夠充分利用系統(tǒng)分配的時間片。為定時器控件的Interval屬性設(shè)置較大的值,這將使處理更為有效。充分搶先式多任務(wù)操作系統(tǒng)的特點,能夠防止其他應(yīng)用程序被阻塞。而且在取消長時間任務(wù)時,用戶通常也能夠容忍短暫的延遲。如果在編制多線程任務(wù)時,最好能以定時器控件的Enabled屬性為標志,防止其他線程再次啟動已經(jīng)運行的后臺任務(wù)。例14.7
建立圖一個單窗體工程,向工程中添加一個定時器控件(Timer1)和一個圖像框控件(Image1),然后在代碼窗口中編寫以下程序,DimNowXAsInteger'定義窗體模塊變量NowX
PrivateSubForm_Load()Timer1.Interval=65'App.Path系統(tǒ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窗體模塊級變量用來保存下一個將被'顯示的圖片的主文件名m=App.Path&"\"&CStr(NowX)&".jpg"Image1.Picture=LoadPicture(m)Form1.Width=Image1.WidthImage1.RefreshImage1.Top=0IfNowX>=4ThenNowX=0EndIfEndSub本程序運行時,要保證程序文件所在目錄內(nèi)有4個圖形文件,文件名分別為1.jpg、2.jpg、3.jpg和4.jpg,并且每個圖片的高度都要大于本程序中窗體對象的高度。在以上條件被滿足時運行該程序會實現(xiàn)這樣的程序功能:在一定的時間間隔,圖形向上移動,當一個圖形的全部內(nèi)容都被顯示后,再換下一個圖形。當4個圖形都顯示完以后,再從1.jpg圖片重新顯示。在本程序運行時,我們可以使用鼠標拖拽該程序窗口進行移動。這代表操作系統(tǒng)除了本程序中響應(yīng)定時器對象的Timer事件外,還可以響應(yīng)其他操作。也就是說,系統(tǒng)中其他程序沒有因為運行當前程序而被阻塞。從而達到了進行后臺操作的目的。14.3.2使用DoEvents語句進行后臺處理盡管定時器控件是進行后臺處理很好的工具,但是我們還有更加專業(yè)一些的方法,那就是DoEvents語句。VisualBasic中DoEvents語句的作用是暫時把控制權(quán)交還給Windows操作系統(tǒng),以便讓操作系統(tǒng)處理其他事件。DoEvents語句的語法如下:DoEvents讓我們對例14.6進行一些改變,得到以下程序:例14.8PrivateSubForm_Click()DimxAsDoublePrintNow()x=1Fori=1To1000000'作100萬次浮點乘法運算x=i*3.1415926DoEvents'把控制權(quán)交還給操作系統(tǒng),允許系統(tǒng)響應(yīng)其他事件。NextiPrintxPrintNow()EndSub前面章節(jié)中我們看到了,當例14.6程序運行時,我們甚至不能用鼠標移動其窗體對象到其他位置。但是在我們向例14.6程序的For循環(huán)語句中加上了DoEvents語句后,在該程序運行時我們就可以用鼠標移動其窗體對象。這是因為DoEvents語句把控制權(quán)交還給操作系統(tǒng),允許Windows系統(tǒng)響應(yīng)其他事件。因此,我們用鼠標移動其窗體對象的操作自然會被響應(yīng)??墒羌毿牡淖x者會發(fā)現(xiàn),為什么要把例14.6程序中1億次循環(huán)浮點乘法運算,給變成例14.8程序中100萬次循環(huán)浮點乘法運算呢?其實在我們看完其運算結(jié)果后,這個疑問自然會被解開的。下圖顯示了作者的電腦運行例14.8的結(jié)果。我們會發(fā)現(xiàn),在For循環(huán)中加上了DoEvents語句后,進行100萬次浮點乘法運算居然需要8秒鐘的時間。而如果去掉DoEvents語句,如例14.6程序運行結(jié)果,進行1億次浮點乘法運算所消毫的時間也只有18秒左右。這也說明了,雖然DoEvents語句允許操作系統(tǒng)響應(yīng)其他事件的操作,但是這是以大量消耗程序運行速度為代價的。運行結(jié)果因此在讀者使用DoEvents語句時,一定要慎重考慮在你的程序中使用它是否合適,會不會大規(guī)模的降低我們程序的處理效率。那么有沒有一種比較折中的辦法,讓程序既能響應(yīng)操作系統(tǒng)的其他操作,同時又能夠以較高的效率來進行后臺處理,回答當然是肯定的。其實這只是一種編程的技巧,我們可以把例14.6作進一步的改變。其改變后的程序代碼如例14.9所示。例14.9PrivateSubForm_Click()DimxAsDoublePrintNow()x=1Forj=1To1000'外循環(huán)總共循環(huán)了1000次Fori=1To100000'每次內(nèi)部循環(huán)執(zhí)行10萬次浮點乘法運算x=i*3.1415926NextIDoEvents'把控制權(quán)交還給操作系統(tǒng),允許系統(tǒng)響應(yīng)其他事件。Nextj'最終我們共執(zhí)行了1億次浮點乘法運算PrintxPrintNow()EndSub該程序運行結(jié)果如下圖所示。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年新學(xué)期開學(xué)第一課主題班會教案
- 面對風(fēng)險:成功企業(yè)家的關(guān)鍵風(fēng)險控制策略
- 高中語文老師2025年個人方案
- 汽車使用與維護 課件 項目一 汽車發(fā)動機艙蓋與后備箱蓋的使用與維護
- 2025年玻璃單臂異形磨邊機項目可行性研究報告
- 2025年環(huán)保型彩色鍍鋁禮品包裝紙項目可行性研究報告
- 2025年特效凈水項目可行性研究報告
- 2025年燃氣烤豬爐項目可行性研究報告
- 山東省臨沂一中2025屆高三2月份生物試題模擬試題含解析
- 吉林省白城地區(qū)大安縣2025年初三期末熱身聯(lián)考物理試題含解析
- 景觀人行吊橋(懸索橋)施工組織設(shè)計
- 八大特殊作業(yè)試題及答案
- 車輛轉(zhuǎn)讓確認書
- 教學(xué)教案檢查記錄表
- 二氧化碳爆破方案
- 人工智能第2章知識表示課件
- 生活垃圾填埋場設(shè)計規(guī)范
- 有機化學(xué)第四篇芳香烴
- T∕ACSC 01-2022 輔助生殖醫(yī)學(xué)中心建設(shè)標準(高清最新版)
- 關(guān)于國家重點研發(fā)計劃重點專項中國生物技術(shù)發(fā)展中心
- 三國兩晉南北朝大事年表
評論
0/150
提交評論