5.顯式聲明與自動保存
在默認情況下,VisualBasic會把未聲明的變量認為是新變量(即使是你不小心打錯字了),這樣很容易出現錯誤,而且要找出這樣的錯誤往往很不容易。加上API的操作基本上都會涉及到系統本身,一旦出錯就有可能出現VisualBasic崩潰甚至系統崩潰。所以到VisualBasic的選項設置中選上RequireVariableDeclaration(需要變量聲明)。在Enviroment(環境)頁中的Whenaprogramstarts(當程序啟動時)處選上PromptToSaveChanges(提示保存)或SaveChanges(自動保存)。這樣VisualBasic會檢查變量是否已經聲明,不再允許沒有聲明的變量出現了。
6.API瀏覽器
前面講“聲明”的時候提到了API瀏覽器,這里也說一說它。在安裝完VB時,安裝程序會把API瀏覽器復制到你的計算機里。啟動后界面如圖1(以VB6為準)??梢钥吹剑瑥腁PI瀏覽器里我們可以得到API的聲明、常量值以及與API相關的自定義類型的定義。其中DeclareScope(聲明范圍)是指該聲明是公有的還是私有的。對于在標準模塊中的聲明,如果聲明為私有,則只對該模塊有效,如果為公有,則對整個程序都有效。在窗體模塊中只能聲明為私有。
7.MSDN
MSDN是微軟發布的一套完整的Windows開發者技術文檔(如圖2)。里面不僅有VB、VC++、VFP、MSDEV、VSS等開發工具的完整幫助,而且包含了Windows平臺開發的幾乎所有的技術資料,并不斷地更新。我們需要的API資料這里都有很詳細的說明,包括使用平臺、參數類型、參數作用等(當然它并非完全正確,錯誤的地方也時有出現)。不過作為以C為基礎的API,這里的資料是英文的,而且格式也是C語言格式。想要讀懂,那你的英文水平和C語言就要有兩把刷子了。不過不必擔心,它只是我建議一定要有的參考文檔,最重要的還是我接下來要講的內容,它不僅是中文的,還是VB的,又有使用示例,還有相關知識講解。記住MSDN只是參考文檔,作用就好像字典,可千萬不要買了一套MSDN就跑去跟別人說你已經變得多厲害了,不然……
順便說一說,以前的MSDN是雙CD的,現在已經變成3CD了。如果買的話應盡量買最新的(但沒有必要每次更新都換一套),因為更新的版本把一些錯誤改正了,并增加了新的內容,比如最新的MSDN已經增加了許多WindowsXP的內容。你可以從微軟的中國網站訂到這套文檔,不過一年的價錢從一萬幾到三萬幾,買不起的話……自己想辦法吧。
好了,開篇寫了這么多,無非也是想讓讀者在以后可以更容易理解所講的內容。這些是基礎,是一定要記住的。下面我們就先介紹一個比較簡單的API,開始我們的API之旅吧!
第一話從消息說起
由于這是《細水長流話API》的第一話,我必須注意到所講的內容要簡單,并且讓你有耐心可以看到往后的文章,所以我希望可以通過一個比較特別的例子來引起你的注意(這樣的情況不會總是有的)。讓我們想想,VB里的CommandButton控件讓我們可以做什么?按下、彈起,還有呢?請看看圖3,這樣的情況在你的程序運行時出現過嗎?
Windows是以消息來傳遞信息的。當出現某個操作,比如按鈕被按下,就產生按鈕被按下的消息。消息被傳送到被操作對象(按鈕),事件就產生了。應注意不是按鈕產生消息,而是Windows知道這個操作的發生,向按鈕發送這個消息,按鈕收到后再做相應的處理——如改變外觀成為按下的狀態。
Windows允許第三者向某個對象發送消息,因此當某個操作沒有發生時,我們是可以讓對象如同收到消息一樣產生效果的,這就需要用到API函數——SendMessage了。
SendMessage的聲明前面已經說過(注意以Public開頭應放在標準模塊中,否則用Private開頭),它的各個參數中,hwnd是對象的句柄,wMsg是消息的值(具體什么消息),另外兩個參數根據不同消息和不同應用有不同的值。
你看到的圖3的情況,是由于我的程序向CommandButton控件發送了WM_NCLBUTTONDOWN消息。這個消息發生在鼠標在窗口的非客戶區域上按下時。所謂非客戶區域,你可以理解成一個窗口的邊緣和標題欄(當然是指一般情況,這種情況是可以被程序改變的)。
在我這個按鈕的MouseDown事件中,只寫了短短的幾句:
PrivateSubcmdResize_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
DimnParamAsLong
WithcmdResize
'之所以在0和100之間以及下面.Width-100和.Width之間,是讓鼠標只在按鈕邊緣才可以拉動按鈕
IfX>0AndX<100Then
nParam=HTLEFT
ElseIfX>.Width-100AndX<.WidthThen
nParam=HTRight
EndIf
IfnParamThen
CallReleaseCapture
CallSendMessage(.hwnd,WM_NCLBUTTONDOWN,nParam,0)
EndIf
EndWith
EndSub
可以看到,我讓鼠標拉動按鈕時,拉按鈕左邊是用HTLEFT做參數,拉右邊是用HTRIGHT做參數。這兩個都是常量,可以從API瀏覽器中得到值。同樣的,若想拉按鈕的上面和下面,可用HTTOP和HTBOTTOM做參數,而HTTOPLEFT和HTBOTTOMRIGHT則分別是左上角和右下角。
在發送消息之前有一個ReleaseCapture的API。這個API是讓Windows釋放對鼠標的捕捉以便使鼠標位置的信息不能被收到,CommandButton不知道鼠標在哪里,也就不會發生按鈕在這時被按下的情況。當然,可以放心,Windows釋放對鼠標的捕捉只是暫時的,當你放開鼠標再次發生移動時,Windows又會捕捉鼠標了——它是時時都在發生的。
你可能希望如同我的程序一樣在按鈕邊緣光標會變化,下面是我寫的程序段:
PrivateSubcmdResize_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
DimNewPointerAsMousePointerConstants
WithcmdResize
IfX>0AndX<100Then
NewPointer=vbSizeWE
ElseIfX>.Width-100AndX<.WidthThen
NewPointer=vbSizeWE
Else
NewPointer=vbDefault
EndIf
IfNewPointer<>.MousePointerThen
.MousePointer=NewPointer
EndIf
EndWith
EndSub
作用很明顯,而且很簡單,所以我就不對這段代碼作解釋了。
這個例子很簡單,但相信起的作用是不小的。SendMessage可以發送很多消息,當然我不會對這些消息一一作解釋,但以后還是會經常接觸到的,所以更多的知識就等慢慢再學吧。
文中程序在Windows2000 VB6環境下調試通過。
新聞熱點
疑難解答