標(biāo)題: VB編程基礎(chǔ)課 [打印本頁]

作者: 51黑黑黑    時(shí)間: 2016-2-22 00:42
標(biāo)題: VB編程基礎(chǔ)課
VB編程基礎(chǔ)課 什么是API API文本游覽器 API函數(shù)聲明 數(shù)據(jù)類型與"類型安全" 常 數(shù) 結(jié) 構(gòu) 小 結(jié) 一些API函數(shù)集: 控件與消息函數(shù)、 硬件與系統(tǒng)函數(shù)、 菜單函數(shù)、 繪圖函數(shù) 什么是API  
首先,有必要向大家講一講,什么是API。所謂API本來是為C和C++程序員寫的。API說來說去,就是一種函數(shù),他們包含在一個(gè)附加名為DLL的動(dòng)態(tài)連接庫(kù)文件中。用標(biāo)準(zhǔn)的定義來講,API就是Windows的32位應(yīng)用程序編程接口,是一系列很復(fù)雜的函數(shù),消息和結(jié)構(gòu),它使編程人員可以用不同類型的編程語言編制出的運(yùn)行在Windows95和Windows NT操作系統(tǒng)上的應(yīng)用程序。可以說,如果你曾經(jīng)學(xué)過VC,那么API對(duì)你來說不是什么問題。但是如果你沒有學(xué)過VC,或者你對(duì)Windows95的結(jié)構(gòu)體系不熟悉,那么可以說,學(xué)習(xí)API將是一件很辛苦的事情。
如果你打開WINDOWS的SYSTEM文件夾,你可以發(fā)現(xiàn)其中有很多附加名為DLL的文件。一個(gè)DLL中包含的API函數(shù)并不只是一個(gè),數(shù)十個(gè),甚至是數(shù)百個(gè)。我們能都掌握它嘛?回答是否定的∶不可能掌握。但實(shí)際上,我們真的沒必要都掌握,只要重點(diǎn)掌握Windos系統(tǒng)本身自帶的API函數(shù)就可以了。但,在其中還應(yīng)當(dāng)拋開掉同VB本身自有的函數(shù)重復(fù)的函數(shù)。如,VB
的etAttr命令可以獲得文件屬性,SetAttr可以設(shè)置文件屬性。對(duì)API來講也有對(duì)應(yīng)的函數(shù)
GetFileAttributes和SetFileAttributes,性能都差不多。如此地一算,剩下來的也就5、600個(gè)。是的,也不少。但,我可以敢跟你說,只要你熟悉地掌握100個(gè),那么你的編程水平比現(xiàn)在高出至少要兩倍。盡管人們說VB和WINDOWS具有密切的關(guān)系,但我認(rèn)為,API更接近
WINDOWS。如果你學(xué)會(huì)了API,首要的收獲便是對(duì)WINDOWS體系結(jié)構(gòu)的認(rèn)識(shí)。這個(gè)收獲是來自不易的。
如果你不依靠API會(huì)怎么樣?我可以跟你說,絕大多是高級(jí)編程書本(當(dāng)然這不是書的名程叫高級(jí)而高級(jí)的,而是在一開始的《本書內(nèi)容》中指明《本書的閱讀對(duì)象是具有一定VB基礎(chǔ)的讀者》的那些書),首先提的問題一般大都是從API開始。因此可以說,你不學(xué)API,你大概將停留在初級(jí)水平,無法往上攀登。唯一的途徑也許就是向別人求救∶我快死了,快來救救我呀,這個(gè)怎么辦,那個(gè)怎么辦?煩不煩呢?當(dāng)然,現(xiàn)在網(wǎng)上好人太多(包括我在內(nèi),嘻嘻),但,你應(yīng)當(dāng)明白,通過此途徑,你的手中出不了好的作品。這是因?yàn)槿狈@些知識(shí)你的腦子里根本行不成一種總體的設(shè)計(jì)構(gòu)思。 API文本游覽器
[返回] 很多API函數(shù)都是很長(zhǎng)很長(zhǎng)的。想看什么樣子嗎?如下就是作為例子的API DdeClientTransaction函數(shù)∶
Declare Function DdeClientTransaction Lib "user32" (pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByVal dwTimeout As Long, pdwResult As Long) As Long
哇!這么長(zhǎng)?如果你從來沒有接觸過API,我想你肯定被嚇住了。你也許考慮,該不該繼續(xù)學(xué)下去。不過不要擔(dān)心,幸運(yùn)的是Microsoft的設(shè)計(jì)家們?yōu)槲覀兲峁┝擞杏玫墓ぞ撸@便是API
文本查看器。
通過API文本查看器,我們可以方便地查找程序所需要的函數(shù)聲明、結(jié)構(gòu)類型和常數(shù),然后將它復(fù)制到剪貼板,最后再粘貼到VB程序的代碼段中。在大多數(shù)情況下,只要我們確定了程序所需要的函數(shù)、結(jié)構(gòu)和常數(shù)這三個(gè)方面后,就可以通過對(duì)API文本游覽器的以上操作將他們加入到程序段中,從而程序中可以使用這些函數(shù)了。這些是學(xué)習(xí)API最基本的常識(shí)問題,它遠(yuǎn)遠(yuǎn)占不到API的龐大的體系內(nèi)容。今后我們把精力浪費(fèi)(這絕不是浪費(fèi))在哪里呢?那就是∶
什么時(shí)候使用什么函數(shù),什么時(shí)候使用什么結(jié)構(gòu)類型,什么時(shí)候使用什么常數(shù)。 API函數(shù)聲明
[返回] 讓我們回想一下。在VB中,如何聲明函數(shù)呢?我想,如果你正在看此文,那么你絕對(duì)能夠回答得出這個(gè)問題。以下便是你應(yīng)該很熟悉的函數(shù)聲明∶
Function SetFocus (ByVal hwnd As Long) As Long
即,這行代碼定義了名為SetFocus的函數(shù),此函數(shù)具有一個(gè)Long型數(shù)據(jù)類型的參數(shù),并按值傳遞(ByVal),函數(shù)執(zhí)行后將返回一個(gè)Long型數(shù)據(jù)。
API函數(shù)的聲明也很類似,如,API中的SetFocus 函數(shù)是這樣寫的∶
Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
有點(diǎn)復(fù)雜了一些。是的,是復(fù)雜了點(diǎn)。但我可以告訴你,除了這些多出來的部分,其他部分還是和你以前學(xué)到的東西是一樣的。函數(shù)在程序中的調(diào)用也是一樣。如:
Dim dl As Long
dl&=SetFoucs(Form1.Hwnd)
但,一點(diǎn)是清楚的。它不象你自己寫的程序那樣能夠看到里面的運(yùn)行機(jī)理,也不像VB
自帶的函數(shù)那樣,能夠從VB的聯(lián)機(jī)幫助中查到其用法。唯一的方法就是去學(xué)、查VB以外的資料。
Declare 語句用于在模塊級(jí)別中聲明對(duì)動(dòng)態(tài)鏈接庫(kù) (DLL) 中外部過程的引用。對(duì)此,你只要記住任何API函數(shù)聲明都必須寫這個(gè)語句就可以了。
Iib 指明包含所聲明過程或函數(shù)的動(dòng)態(tài)鏈接庫(kù)或代碼資源。也就是說,它說明的是,函數(shù)或過程從何而來的問題。
如在上例中,SetFocus Lib "user32"說明 函數(shù) SetFocus 來自 user32.dll文件。主要的dll動(dòng)態(tài)連接庫(kù)文件有∶
user32.dll Windows管理。生成和管理應(yīng)用程序的用戶接口。
GDI32.dll 圖形設(shè)備接口。產(chǎn)生Windows設(shè)備的圖形輸出
Kernel32.dll 系統(tǒng)服務(wù)。訪問操作系統(tǒng)的計(jì)算機(jī)資源。
注意,當(dāng)DLL文件不在Windows或System文件夾中的時(shí)候,必須在函數(shù)中說明其出處(
路徑)。如,SetFocus Lib "c:\Mydll\user32"
函數(shù)聲明中的Alias 是可選的。表示將被調(diào)用的過程在動(dòng)態(tài)鏈接庫(kù) (DLL) 中還有另外的名稱(別名)。如,Alias "SetFocus" ,說明SetFocus函數(shù)在User32.dll中的另外一個(gè)名稱是,
SetFocus。怎么兩個(gè)名都一樣呢?當(dāng)然,也可以是不同的。在很多情況下,Alias說明的函數(shù)名,即別名最后一個(gè)字符經(jīng)常是字符A,如SetWindowsText函數(shù)的另一個(gè)名稱是
SetWindowsTextA,表示為Alias "SetWindowsTextA"。這個(gè)A只不過是設(shè)計(jì)家們的習(xí)慣的命名約定,表示函數(shù)屬于ANSI版本。
那么,別名究竟有什么用途呢?從理論上講,別名提供了用另一個(gè)名子調(diào)用API的函數(shù)方法。如果你指明了別名,那么 盡管我們按Declare語句后面的函數(shù)來調(diào)用該函數(shù),但在函數(shù)的實(shí)際調(diào)用上是以別名作為首要選擇的。如,以下兩個(gè)函數(shù)(Function,ABCD)聲明都是有效的,他們調(diào)用的是同一個(gè) SetFocus函數(shù)∶
Declare Function SetFocus Lib "user32" "SetFocus" (ByVal hwnd As Long) As Long
Declare ABCD SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
需要注意的是,選用Alias的時(shí)候,應(yīng)注意別名的大小寫;如果不選用Alias 時(shí)的時(shí)候,函數(shù)名必須注意大小寫,而且不能改動(dòng)。當(dāng)然,在很多情況下,由于函數(shù)聲明是直接從API
文本游覽器中拷貝過來的,所以這種錯(cuò)誤的發(fā)生機(jī)會(huì)是很少的,但您有必要知道這一點(diǎn)。
最后提醒你一句,API聲明(包括結(jié)構(gòu)、常數(shù))必須放在窗體或模塊的"通用(General Declarations)段。 數(shù)據(jù)類型與"類型安全"








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1