做為一個不斷進取的編程者,我們常常不滿足於編程語言所提供的一般功能,總是希望能夠實現一些特殊的功能,這有時不但是我們程序的要求,有時也是編程者心理上需要(試想,還會有什麼比在深夜中巧妙解決一個難題而更令人興奮呢?)。VisualBasic,做為一個當前最流行的快速編程環境,就給我們提供了實現這些目標的平台,事實上,它無限擴展的API接口可以實現所有WINDOWS下可以實現的功能。然而對於初學者來說,"浩瀚"的API函數總是顯得那麼神奇與不可琢磨,因此在實際應用過程中不能夠靈活應用。下面我將結合兩個小例子來示范介紹VB中調用API函數的步驟和功能,並總結說明在實際工作中如何提高這方面的技巧。例子在WINDOWS98下采用VB6.0編譯。
一.限制鼠標的移動
----有時我們的軟件要求用戶在未完成某一任務時,鼠標不能移出當前活動控件,換句話就是將鼠標限制在控件的內部,直到任務完成或用戶中斷為止。這個功能借助API函數實現起來思路很清楚,代碼也很簡潔。其思路是先確定當前鼠標的位置;然後確定當前活動控件的大小;最後將鼠標限制在活動控件內。(下面忽略項目建立等過程)
----1.建立一個新項目:新窗體為form1,在form1上添加一個commandbutton,設置其Name=CMButton1;Caption="將鼠標限制在此按鈕中"
----2.拷貝API函數和POINTAPI結構:打開VB6.0自帶的API浏覽器,調入WIN32API.txt文件,復制以下結構和函數聲明到form1的聲明部分:
PrivateTypeRECT
LeftAsLong
TopAsLong
RightAsLong
BottomAsLong
EndType
PrivateTypePOINTAPI
xAsLong
yAsLong
EndType
PrivateDeclareFunctionClientToScreenLib
"user32"Alias"ClientToScreen"(ByVal
hwndAsLong,lpPointAsPOINTAPI)AsLong
'用來確定當前鼠標的位置
PrivateDeclareFunctionClipCursorLib
"user32"Alias"ClipCursor"(lpRectAsAny)
AsLong'用來限定當前鼠標的活動范圍
----3.定義一個通用過程ConfineTo
PublicSubConfineTo(myCtlAsObject)
OnErrorResumeNext
DimtmpRectAsRECT
DimptAsPOINTAPI
WithmyCtl
IfTypeOfmyCtlIsScreenThen'鎖定在屏幕范圍內
tmpRect.Left=0
tmpRect.Top=0
tmpRect.Right=(.WidthScreen.TwipsPerPixelX)
tmpRect.Bottom=(.HeightScreen.TwipsPerPixelY)
ElseifTypeOfmyCtlIsform'鎖定在窗體范圍內
tmpRect.Left=(.LeftScreen.TwipsPerPixelX)
tmpRect.Top=(.TopScreen.TwipsPerPixelY)
tmpRect.Right=(.Left .Width)Screen.TwipsPerPixelX
tmpRect.Bottom=(.Top .Height)Screen.TwipsPerPixelY
else
pt.X=0
pt.Y=0
CallClientToScreen(.hWnd,pt)
'獲取當前控件在屏幕上的位置
tmpRect.Left=pt.X
'保存當前控件位置
tmpRect.Top=pt.Y
pt.X=.Width
pt.Y=.Height
CallClientToScreen(.hWnd,pt)
tmpRect.Bottom=pt.Y
tmpRect.Right=pt.X
EndIf
CallClipCursor(tmpRect)
EndWith
EndSub
----4.在CMButton1_Click()中加入以下代碼
StaticClipedAsBoolean
'靜態變量用來控制狀態切換
IfNotClipedThen
ConfineToCmbutton1
Cliped=True
Else
ConfineToScreen'取消鼠標限制
Cliped=True
EndIf
----5.運行後,鼠標點擊cmbutton1,此時鼠標只能被鎖定在此按鈕內部,再次點擊按鈕,限制取消。
二.創建臨時文件
----臨時文件用來保存軟件運行過程中的臨時變化,這對於熟悉WORD等軟件的人來說,經常會遇到。那麼臨時文件是如何產生的呢,其實很簡單,只需要一個API函數就可以。
----1.拷貝聲明函數(方法同前)
PrivateDeclareFunctionGetTempFileNameLib"kernel32"_
Alias"GetTempFileNameA"(ByVallpszPathAsString,_
ByVallpPrefixStringAsString,ByValwUniqueAsLong,_
ByVallpTempFileNameAsString)AsLong
參數定義如下:
lpszPath=傳入保存臨時文件的路徑,如"C:mytemp"
lpPrefixString=傳入臨時文件名開始的前三個字母,
起到幫助識別臨時文件來源的作用。
wUnique=0,windows隨機產生文件名;否則安其值定義文件名。
lpTempFileName=返回隨機文件名
----2.返回臨時文件名
PrivateFunctionGenTempName(sPathAsString)
DimsPrefixAsString
DimlUniqueAsLong
DimsTempFileNameAsString
IfIsEmpty(sPath)ThensPath="c: emp"
sPrefix="TVB"
lUnique=0'windows隨機給名
sTempFileName=Space$(100)
GetTempFileNamesPath,sPrefix,lUnique,sTempFileName
sTempFileName=Mid$(sTempFileName,1,
InStr(sTempFileName,Chr$(0))-1)'去掉多余空格
GenTempName=sTempFileName
EndFunction
----3.將下面代碼加入到form1_click()事件中
MsgBoxGenTempName("c: emp")
----4.運行,鼠標點擊form,彈出msgbox,顯示生成"c: empTVB724.tmp"文件,用文件管理器查看,在c: emp下有TVB724.tmp文件,長度為0K。
----需要注意的是,傳入的路徑必須是有效路徑,否則GenTempName函數返回0,lpTempFileName中也沒有臨時文件名。
三.結束語
----從上面可以看出,API函數的確簡單高效,但也充滿一些看似高深的變量而使人卻步。我們不禁會問,究竟什麼時候要用到API函數?具體哪些函數可以解決我的問題?,那些函數中的變量都代表什麼?其實對這些問題,即使對一個VB高手也難給出明確的回答,因為API函數庫實在太龐大了,每一個人最終只能熟悉其中的一小部分(這也可能是調用API的文章層出不窮的原因吧)。總結自己的一點經驗,我覺得應該注意以下幾點。
----1.熟練掌握VB基本技巧,了解其所能所不能,這是最基本的要求。
----2.了解WINDOWS內部控制機理,這樣對一些復雜的問題就可以逐步分析其調用機制,初步確定采用哪部分的API函數來解決問題。
----3.案頭必備一本最新的VB版的WINDOWSAPI大全,推薦機械工業出版社的<>。書中給出了每一個VB可以調用的API函數的詳細說明,可以幫助精確了解所需要的API函數的變量聲明。
----4.多看別人的程序。報紙雜志,尤其是網上這方面的文章數不清。這是最快的方法。
----5.隨用隨查。永遠不要在用不到的函數上浪費寶貴的時間->