亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

感悟VB細水長流話API

2019-11-18 17:34:30
字體:
來源:轉載
供稿:網友
編寫VB程序時,經常遇到的問題就是VB給我們準備的東西我們會用,控件組裝就是一個程序,然而一旦想要實現VB沒有直接提供的功能,就會不知所措。其實Windows操作系統本身就給我們準備了許多東西,VB沒有的,或許Windows有。我們當然希望少花力氣,多得效果。這里要講的內容就是——學會利用Windows給我們的東西:API。

  然而,學會一種東西是需要付出相當的努力的,API也一樣,它可以給我們帶來很大的方便,但想要掌握它,就不是使用幾個控件那么輕松的事了。所以在看這篇文章時,希望讀者可以抱一個正確的態度,就是學習編程不是為好玩,而是為使用;不要以自己對這方面是否有興趣而看,而要為API是否能為你的程序帶來效果而看。我并不是說一切都是那么嚴肅和困難,只是API對VB來說,已經可以算高級方面的應用了,所以“認真”和“仔細”是需要的。好了,放松一點,讓我們從現在起一步步領略API的好處吧。

  前言

  1.API

  API全稱為applicationPRogrammingInterface,直譯的話可叫它“應用程序接口”。從意義上來說,API是一個操作系統或某個程序本身提供給其他程序使用的函數。在Windows操作系統中,有成千個Windows的函數提供給應用程序使用,本文所說的API,就是指這些函數。

  2.VB與API

  之所以寫這篇文章(而不寫VC或其他語言),是因為VB對API的支持不是直接的,而且是不完全的;在使用上,Windows的API編寫時是假設調用者是C或C 語言,因此VB調用API不是很方便,也經常有不必要的錯誤或不明白如何使用的情況出現。本文的對象主要還是對API沒有很深研究的讀者,如果你不想了解太多細節,你可以把一個合適的函數用法搬過去,或者你完全不知道API,或者只知道少數,對許多函數還不清楚如何使用,或者你希望可以從本文學到更多使用API的技巧甚至VB的技巧(但愿我可以讓你學到),我想你都應該看這篇文章。但還是有個大前提,你必須是已經會使用VB的讀者,因為以后講到的內容不會有一個完整工程從頭到尾教你做,有可能是一段簡短的聲明與調用代碼,也可能是幾個函數的組合,如果必要的話,也會講述相關內容的VB技巧,但一定不會有完整的實例示范。

  3.本文原則和約定

  由于API中有的用法簡單有的復雜,有的可單獨使用有的卻不行,加上各個API的主要用途不同,很難判斷先說哪個再說哪個可以讓人更容易理解,因此本文盡量從比較常用的說起,從可以對程序產生較大作用的說起。為了能讓多數人理解,如果需要涉及到其他方面的知識,也將盡量講述,讓讀者可以學到使用API的知識,并能夠利用本文中的知識應付新的API。如果你對某個API有什么疑問,歡迎來信(webmaster@neocactus.com),但由于時間有限,不能對來信一一回復,如果有需要,將會在文中講述。

基礎知識

  在講API之前,讓我先講解一些與API相關的VB基礎知識,后文如有涉及將不再詳述。此處未提及的,將在本文中第一次接觸時再做解釋。

  1.自定義類型

  VB中可以使用Type關鍵字將已有的數據類型進行組合,成為一個新的類型,該類型就稱為用戶自定義類型。如:

TypeNewType
sNameAsString
lNumberAsLong
EndType

  定義了一個名為NewType的自定義類型。以后可以用DimMyTypeAsNewType來定義一個NewType類型的變量。

  sNameAsString類型的變量有兩種,一種是變長,即運行時的字符串長度是可變的,另一種是定長,運行時字符串的長度是固定的。平常我們定義一個字符串變量:DimstrAAsString即定義了一個變長的字符串,但在使用API時經常要用到定長的字符串,應該這樣定義:DimstrBAsString*30,即定義了一個可容納30個字節字符的變量。

  2.聲明

  VB中使用API之前,需要先對API進行聲明,聲明的方法是使用Declare關鍵字,如:
PublicDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong
聲明了一個名為SendMessage的API函數。許多API的聲明可以在API瀏覽器中找到,而且本文在講述一個API時也會給出聲明,更深入的知識將在以后講述。

  3.句柄

  API中使用得最多的一個詞大概就是“句柄”了。如果要說得復雜些,句柄的確可以說上一大堆,不過作為VB的應用,我們可以更簡單地去理解它??梢赃@么說,句柄是Windows系統賦予內存中每一個對象,包括窗口、按鈕(其實也是一種窗口)或者文件、圖標、菜單等等所有東西的標識。所謂標識就如身份證一樣,是不會重復并且和實際對象是一一對應的。它的作用是讓Windows知道將被操作的對象是誰。許多VB控件都提供了一個長型的hWnd屬性,一般情況下,這個屬性就是這個控件的句柄,用API控制這個控件時就需要用到這個屬性了。

  4.設備上下文

  其實我覺得“設備上下文”這個詞讀起來很奇怪,不過就其字面來看,DeviceContext(DC,可不是直流電或DreamCast哦)就是這個意思,許多人也這么稱它。不過我想翻譯為“設備中介”大家應該更容易理解吧。它的作用是作為計算機設備和程序之間的中介,比如顯示器和程序之間,或者打印機和程序之間。在對這些設備操作的時候,是需要通過這個中介操作的(與句柄相似),一些控件,如Picture,想在上面畫圖時,就要用到hDC屬性了。

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環境下調試通過。源程序下載

->


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩高清人体午夜| 亚洲欧美日韩精品久久亚洲区| 亚洲成人亚洲激情| 人人澡人人澡人人看欧美| 一区二区三区四区视频| 热久久视久久精品18亚洲精品| 日韩中文字幕网站| 久久精品视频va| 青草热久免费精品视频| 国产热re99久久6国产精品| 亚洲成人av片在线观看| 中文字幕亚洲自拍| 欧美国产高跟鞋裸体秀xxxhd| 亚洲一区二区三区毛片| 久久精品视频免费播放| 国产精品国产亚洲伊人久久| 日韩最新在线视频| 亚洲一区二区中文| 日产日韩在线亚洲欧美| 欧美日韩国产区| 亚洲美女视频网站| 26uuu亚洲国产精品| 欧美天堂在线观看| 亚洲精品国产拍免费91在线| 欧美性xxxx极品hd欧美风情| 欧美日韩福利在线观看| 国产成人鲁鲁免费视频a| 91精品在线一区| 日韩中文字幕国产精品| 国内精品视频一区| 国产香蕉一区二区三区在线视频| 成人精品在线观看| 96国产粉嫩美女| 亚洲欧美一区二区三区四区| www.日韩免费| 91av在线视频观看| 国产啪精品视频网站| 91a在线视频| 亚洲人成网站777色婷婷| 日韩激情第一页| 成人国产精品色哟哟| 91久久精品国产91久久性色| 亚洲无限乱码一二三四麻| 欧美疯狂做受xxxx高潮| 亚洲国产又黄又爽女人高潮的| 亚洲精美色品网站| 国产小视频国产精品| 国产aⅴ夜夜欢一区二区三区| 久久久在线免费观看| 91天堂在线观看| 欧美日韩中文字幕在线视频| 欧美成人精品在线视频| 国产一区二区三区精品久久久| 亚洲男女性事视频| 综合136福利视频在线| 日韩欧美亚洲国产一区| 色悠悠久久88| 青青草成人在线| 国产丝袜一区视频在线观看| 成人福利免费观看| 91在线观看免费观看| 亚洲免费视频一区二区| 国产一区二区日韩精品欧美精品| 亚洲午夜激情免费视频| 中文字幕久久久av一区| 亚洲欧美999| 国产精品久久久久久久天堂| 色偷偷偷亚洲综合网另类| 久热精品视频在线观看一区| 国产精品一二三视频| 国产精品成人v| 九九精品视频在线| 91成品人片a无限观看| 国产原创欧美精品| 欧美噜噜久久久xxx| 久久久久久久国产精品视频| 欧美www在线| 亚洲一区二区久久久| 美女福利视频一区| 亚洲视频在线看| 一区二区在线视频| 日韩资源在线观看| 色婷婷久久一区二区| 国产成人精品网站| 激情成人在线视频| 热久久这里只有精品| 日韩国产欧美区| 亚洲日韩欧美视频| 国产在线精品一区免费香蕉| 亚洲国产成人爱av在线播放| 日韩专区在线播放| 亚洲欧美一区二区激情| 色一区av在线| 日韩av片免费在线观看| 精品女厕一区二区三区| 亚洲在线观看视频网站| 久久成人综合视频| 日本久久中文字幕| 国产精品美女主播| 日本a级片电影一区二区| 久久久国产影院| 国产色婷婷国产综合在线理论片a| 久久精品国产清自在天天线| 成人在线中文字幕| 亚洲一级黄色av| 亚洲国产高清自拍| 亚洲欧洲高清在线| 日韩电影视频免费| 国产精品欧美日韩| 国产成人91久久精品| 亚洲国产精品免费| 精品毛片网大全| 国产在线一区二区三区| 欧美激情一区二区三区久久久| 日韩一区二区三区xxxx| 国产视频自拍一区| 国产精品视频公开费视频| 国产精品999| 精品国产一区二区在线| 日韩视频中文字幕| 成人黄色在线免费| 欧美国产中文字幕| 成人免费淫片aa视频免费| 久久福利视频导航| 亚洲天堂视频在线观看| 国产精品永久免费| 亚洲精选中文字幕| 成人亚洲欧美一区二区三区| 午夜欧美不卡精品aaaaa| 国产精品白嫩美女在线观看| 日韩中文在线中文网在线观看| 欧美裸体视频网站| 国产91精品久| 久久久久一本一区二区青青蜜月| 国模精品一区二区三区色天香| 欧美一级电影免费在线观看| 国产日韩精品视频| www.亚洲男人天堂| 亚洲综合中文字幕在线观看| 国外成人在线视频| 98精品国产高清在线xxxx天堂| 欧美日韩免费观看中文| 国产欧美一区二区三区在线看| 欧美性猛交xxxx乱大交极品| 日本电影亚洲天堂| 亚洲人午夜色婷婷| 三级精品视频久久久久| 福利视频一区二区| 久久久亚洲成人| 国产成一区二区| 欧美精品18videos性欧| 欧美亚洲视频在线观看| 欧美日韩中文字幕在线视频| 丁香五六月婷婷久久激情| 国产精品网址在线| 中文字幕在线视频日韩| 91成人在线播放| 亚洲а∨天堂久久精品9966| 久久中文精品视频| 欧美大秀在线观看| 日韩精品在线第一页| 欧美中文字幕在线播放| 最近2019中文字幕第三页视频| 国产日韩欧美综合|