淺談VB60中的技巧_第1頁
淺談VB60中的技巧_第2頁
淺談VB60中的技巧_第3頁
淺談VB60中的技巧_第4頁
淺談VB60中的技巧_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——淺談VB60中的技巧淺談VB6.0中的實(shí)用技巧

VB6.0中文本框處理技巧

在VisualBasic中,文本框(TextBox)是最常用的控件,熟練運(yùn)用文本框

是開發(fā)出高質(zhì)量的應(yīng)用程序的基礎(chǔ)。筆者在從事應(yīng)用程序開發(fā)中,摸索出有關(guān)文本框的應(yīng)用技巧,寫出來與VB愛好者共享。1、設(shè)置只讀文本框。

有些時(shí)候在窗口顯示一段信息,但又不希望用戶去改變它,怎樣實(shí)現(xiàn)文本的只讀呢?首先,我們可以利用標(biāo)簽框(label)的只讀屬性,以標(biāo)簽來代替文本框以實(shí)現(xiàn)只讀屬性,但也可以用小程序?qū)崿F(xiàn)真正的文本框的只讀。SubText1_KeyPress(keyasciiAsInteger)keyascii=0EndSub

或者也可以用sendkey方法使文本框失去焦點(diǎn),如以下程序:SubText1_KeyDown(KeyCodeAsInteger,ShiftAsInteger)SendKeys\EndSub

2、限定文本框的輸入內(nèi)容和格式。

以下程序可以實(shí)現(xiàn)限定文本框只能輸入數(shù)字:SubText1_KeyPress(keyasciiAsInteger)Ifkeyascii57ThenBeepBeep

johny@keyascii=0EndIfEndSub

若想限定文本框輸入格式,可以使用VB的FORMAT函數(shù),也可以使用專業(yè)版的屏蔽控件(MaskedEdit),通過設(shè)定屏蔽控件的Mask屬性可以對文本框的輸入格式作確切控制。

3、為TextBox創(chuàng)立快捷鍵。

VB規(guī)定,添加在窗體上的控件均在其Tabindex屬性中記載其加載順序,程序

運(yùn)行時(shí)焦點(diǎn)按Tabindex屬性規(guī)定的順序在控件間跳轉(zhuǎn)。而為了簡化操作,可VB中為任何具有caption的屬性的控制創(chuàng)立快捷鍵,這通過caption屬性中在想作為快捷鍵的字母前加&號實(shí)現(xiàn)。但有一個(gè)問題值得注意,而類似文本框這樣的控件無caption這樣的屬性,這時(shí)可將標(biāo)簽與文本框同時(shí)使用。為lable創(chuàng)立快捷鍵,標(biāo)簽Tabindex屬性設(shè)置比文本框小1,又由于label不能接收按點(diǎn),焦點(diǎn)會自動跳至文本框。這相當(dāng)于為文本框創(chuàng)立了快捷鍵。具體步驟如下:

(1)首先繪制標(biāo)簽,再繪制文本框?;螂S意繪制各種控制,將標(biāo)簽Tabindex屬性設(shè)置比文本框小1

(2)在標(biāo)簽的caption屬性中使用“&〞號設(shè)定快捷鍵

這樣就相當(dāng)于為文本框設(shè)定了快捷鍵,當(dāng)你按下標(biāo)簽框的快捷鍵時(shí),焦點(diǎn)就會跳至文本框上。

4、在設(shè)計(jì)時(shí)實(shí)現(xiàn)文本框換行。

對于文本框,在設(shè)計(jì)時(shí)properties窗口不能輸入換行符,但可以再程序執(zhí)行時(shí)

用代碼來換行,即使用ASCII字符的13和10,如以下小程序就可將兩行文本放入文本框:Subform_load()NL=chr(13)+chr(10)

text1.text=“mynameis〞&NL&“l(fā)iuqiang〞Endsub

5、創(chuàng)立口令文本框。

創(chuàng)立口令文本框可用設(shè)置屬性的方法,也可以通過調(diào)用WINDOWS的API應(yīng)用函數(shù)接口來實(shí)現(xiàn)。首先,文本框的屬性Passwordchar和maxlength可用來設(shè)置口令框。其中Passwordchar指定文本框顯示的字符,如指定“*〞,則在文本框內(nèi)顯示“*〞,

Maxlength確定文本框中能輸入幾個(gè)字符。超過Maxlength以后,文本框發(fā)出警告聲,不能接收更多的字符。若使用WINDOWS應(yīng)用函數(shù)接口,可用GetWindowLong、SetWindowsLong和SendMessage等接口函數(shù)來實(shí)現(xiàn),有興趣的讀者可查閱WindowsAPI函數(shù)手冊或VB的聯(lián)機(jī)幫助文件就可以了。

改變ListIndex而不發(fā)生Click事件

在修改Combo或Listview的ListIndex時(shí),會發(fā)生Click事件,下面的函數(shù)可以阻止該事件。聲明:

PrivateDeclareFunctionSendMessageLib_\hWndAsLong,ByValwMsgAsLong,ByVal_wParamAsLong,lParamAsAny)AsLongConstCB_GETCURSEL=&H147ConstCB_SETCURSEL=&H14EConstLB_SETCURSEL=&H186ConstLB_GETCURSEL=&H188

函數(shù):

PublicFunctionSetListIndex(lstAsControl,_ByValNewIndexAsLong)AsLong

IfTypeOflstIsListBoxThenCallSendMessage(lst.hWnd,_LB_SETCURSEL,NewIndex,0&)

SetListIndex=SendMessage(lst.hWnd,_LB_GETCURSEL,NewIndex,0&)ElseIfTypeOflstIsComboBoxThenCallSendMessage(lst.hWnd,_CB_SETCURSEL,NewIndex,0&)

SetListIndex=SendMessage(lst.hWnd,_CB_GETCURSEL,NewIndex,0&)

EndIf

EndFunction

調(diào)整Combo下拉部分的寬度聲明:

PrivateDeclareFunctionSendMessageLib_\

(ByValhwndAsLong,ByValMsgAsLong,_

ByValwParamAsLong,ByVallParamAsLong)AsLongPrivateConstCB_GETDROPPEDWIDTH=&H15FPrivateConstCB_SETDROPPEDWIDTH=&H160PrivateConstCB_ERR=-1函數(shù):

'取得Combo下拉的寬度

'可以利用該函數(shù)比例放大或縮小寬度

PublicFunctionGetDropdownWidth(cboHwndAsLong)AsLongDimlRetValAsLong

lRetVal=SendMessage(cboHwnd,CB_GETDROPPEDWIDTH,0,0)IflRetValCB_ERRThenGetDropdownWidth=lRetVal'單位為pixelsElse

GetDropdownWidth=0EndIf

EndFunction

'設(shè)置Combo下拉的寬度'單位為pixels

PublicFunctionSetDropdownWidth(cboHwndAs_Long,NewWidthPixelAsLong)AsBooleanDimlRetValAsLong

lRetVal=SendMessage(cboHwnd,_

CB_SETDROPPEDWIDTH,NewWidthPixel,0)IflRetValCB_ERRThenSetDropdownWidth=TrueElse

SetDropdownWidth=FalseEndIf

EndFunction

Combo的自動查詢技術(shù)

DeclareFunctionSendMessageLib\(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong

PublicConstCB_FINDSTRING=&H14CPrivateSubCombo1_Change()DimiStartAsInteger

DimsStringAsStringStaticiLeftOffAsIntegeriStart=1

iStart=Combo1.SelStartIfiLeftOff0Then

Combo1.SelStart=iLeftOffiStart=iLeftOffEndIf

sString=CStr(Left(Combo1.Text,iStart))

Combo1.ListIndex=SendMessage(Combo1.hwnd,_B_FINDSTRING,-1,ByValCStr(Left(_ombo1.Text,iStart)))

IfCombo1.ListIndex=-1TheniLeftOff=Len(sString)combo1.Text=sStringEndIf

Combo1.SelStart=iStartiLeftOff=0EndSub

靜態(tài)變量iLeftOff指定了字符長度。自動選擇Text的內(nèi)容

在使用VFP的應(yīng)用進(jìn)行錄入時(shí),每進(jìn)入一個(gè)錄入框,就自動選擇該框中的所有內(nèi)容。利用以下的代碼,也可實(shí)現(xiàn)類似的功能。PrivateSubMyTextBox_GotFocus()AutoSelectMyTextBoxEndSub

SubAutoSelect(SelObjectAsControl)SelObject.SelStart=0

IfTypeOfSelObjectIsMaskEdBoxThen

SelObject.SelLength=Len(SelObject.FormattedText)Else

IfTypeOfSelObjectIsTextBoxThen

SelObject.SelLength=Len(SelObject.Text)EndIfEndIfEndSub

捕捉MouseExit事件

MouseDown、MouseUp、MouseMove。VB似乎提供了很好的Mouse事件。但好象還缺少什么!對!還差MouseExit(鼠標(biāo)移出)事件。在VB中,我們要捕捉MouseExit事件,必須用API函數(shù):

PrivateDeclareFunctionSetCaptureLib\AsLongPrivateDeclareFunctionReleaseCaptureLib\

然后,我們可以在控件(以Picture1為例)的MouseMove事件上加上以下代碼:DimMouseExitAsBoolean

MouseOver=(03、FilelistBox文件列表控件

雙擊文件列表控件,在窗體上調(diào)準(zhǔn)控件的位置和尺寸,控件名稱為“Filel〞,修改“Pattern〞屬性為“*.bmp,*.pcx〞。4、CommandButtom命令按鈕控件

雙擊命令按鈕控件,建立命令按鈕,第一個(gè)取名為Command1,修改Caption屬性為“確認(rèn)〞,其次個(gè)取名為Command2,修改Caption屬性為“取消〞。5、顯示影像的控件

既可以選picture控件,也可選image控件顯示圖像,以image控件為例。雙擊image控件,調(diào)準(zhǔn)矩形框的大小和位置,取名為imagel,設(shè)置strtch屬性。Strech=false時(shí),圖形以原尺寸顯示。二、事件過程的建立1、驅(qū)動器更改事件過程SubDrive-change()①Dirl.Path=Drivel.Drive②ChDrive.Path=Drivel.DriveEndSub

其中①當(dāng)驅(qū)動器發(fā)生更改時(shí),改變目錄路徑;②更改路徑。2、目錄更改事件過程SubDirlchange()Filel.Path=Dirl.PathEndSub

該事件過程是對目錄發(fā)生更改時(shí),作出文件路徑更改的響應(yīng)。3、文件列表單擊事件SubFilel-click()

Imagel.Picture=loadpicture(Filel.path+〞\〞+Filel.FileName)EndSub

單擊任一圖形文件名時(shí),在image控件框上顯示圖像。4、命令按鈕控件

SubCommand1-click()

F1$=Filel.Path+〞\〞+FileNameEndEndSub

SubCommand2-click()F1$=〞〞EndSub

F1$為選擇文件名稱,供軟件使用,若用戶單擊“取消〞按鈕,F(xiàn)1$為空串。單擊驅(qū)動器名可以改變驅(qū)動器,單擊目錄列表中某一目錄可以更改目錄,單擊某一圖形文件可以顯示圖形,在文件列表中按“↑〞或“↓〞鍵,可以隨著文件名的變化,圖像框中的圖形也隨之發(fā)生更改。

F1$可以供應(yīng)用程序調(diào)用,其中包含驅(qū)動器名、目錄和文件名。VB6.0網(wǎng)格中輸入數(shù)據(jù)

VISUALBASIC提供的網(wǎng)格控制(Grid)主要是用來直觀地輸出數(shù)據(jù),但不能

輸入數(shù)據(jù),使用起來很不便利。能不能向網(wǎng)格中輸入數(shù)據(jù)呢?筆者提出了兩種解決方法,供大家參考:

方法一:

改寫網(wǎng)格的KeyPress事件,在每次有合法字符輸入時(shí),把Grid的Text項(xiàng)和輸入字符連接。這種方法缺點(diǎn)是:一代碼較繁雜,需要處理各種ASCII字符信息;二是通過編程只能實(shí)現(xiàn)很少的編輯功能,如用退格鍵刪除前一字符,用Del鍵刪除所有字符;三是這種方法不能輸入漢字,使用起來受到很大的限制。方法二:

利用一文本框作為緩沖,實(shí)現(xiàn)編輯功能。當(dāng)網(wǎng)格改變行列時(shí),把網(wǎng)格當(dāng)前行列的內(nèi)容傳遞給文本框;當(dāng)網(wǎng)格中有ASCII字符產(chǎn)生時(shí),把輸入焦點(diǎn)設(shè)置為文本框,并把輸入的ASCII字符送給文本框;當(dāng)編輯完文本框的內(nèi)容時(shí),按Enter鍵或TAB鍵,把文本框的內(nèi)容送給網(wǎng)格的當(dāng)前行列,并把輸入焦點(diǎn)設(shè)置為網(wǎng)格。如下程序所示(其中Textl為文本框,Labell為標(biāo)簽,Gridl為網(wǎng)格):OptionExplicit

ConstEnterAsc=13ConstTabAsc=9

PrivateSubForm-Load()Labell.Caption=〞請輸入〞EndSub

PrivateSubGridl-KeyPress(KeyAsciiAsInteger)Text1.StFocusTextl.SelStart=0

IfKeyAscii<>EnterAscAndKeyAscii<>TabAscThenSendKeysChr(KeyAscii)EndIFEndSub

PrivateSubGridl-RowColChange()Textl.Text=Grid1.TextEndSub

PrivateSubText1-KeyPress(KeyAsciiAsInteger)IfKeyAscii=EnterAscThenGrid1.SetFocusKeyAscii=0EndIfEndSub

PrivateSubText1-LostFocus()Grid1.Text=Text1.TextEndSub

如何使VB的網(wǎng)格控件具有輸入功能

我們在使用VisualBasicforWindows開發(fā)時(shí),經(jīng)常用到網(wǎng)格控件(Grid.vbx),

由于此控件可以用來作類似于電子表格形式的輸出表,且編程簡單,但在此網(wǎng)格控件只有輸出功能,而不能直接在網(wǎng)格上輸入,這給使用者帶來一些不便。如何在執(zhí)行時(shí)向網(wǎng)絡(luò)控件中輸入數(shù)據(jù),人們使用了一些方法,但大都使用一文本控件作中間轉(zhuǎn)換,即將欲輸入的信息先輸入到該文本控件,然后將文本控件的TEXT屬性賦給網(wǎng)格的TEXT屬性,這種方法盡管解決了向網(wǎng)格輸入數(shù)據(jù)問題,但增加了一文本框,對界面有些不

美觀,修改部分?jǐn)?shù)字不便利,且影響速度,那么,如何直接向網(wǎng)格輸入數(shù)據(jù)呢?本文將解決直接向網(wǎng)格輸入數(shù)據(jù)問題,基本思想是:使用網(wǎng)格控件KeyPress事件,從鍵盤上接收所擊鍵位的KeyAscii值,再由Chr$()或Chr()函數(shù)轉(zhuǎn)換成字符,

然后讀出網(wǎng)格單元的當(dāng)前Text值與由鍵盤接收到的字符相加,組成新的字符串,再賦給該單元的Text屬性,即Grid.Text=Grid.Text+Chr$(KeyAscii)。程序清單如下:程序中定義了兩個(gè)Form級變量WgridCol%和WgridRow%。SubGrid-KeyPress(KeyAsciiasInteger)Grid.Col=WgridCol%Grid.Row=WgridRow%

ifKeyAscii=8Then`keyascii=8為退格刪除鍵ifGrid.Text<>〞〞ThenGrid.Text=Mid$(Grid.Text,1,Len(Grid.Text)-1)‘刪除最終一個(gè)字符Else

Grid.Text=Grid.Text+Chr$(KeyAscii)EndifEndSub

SubGrid-RowColChange()Wgrid.Col%=Grid.ColWgrid.Row%=Grid.RowEndSub

這樣就可以實(shí)現(xiàn)對網(wǎng)格的任意輸入,可以輸入字符、數(shù)字等等。由于數(shù)字0到9的Ascii值為48到57,小數(shù)點(diǎn)Ascii的值為46,所以可以輸入任意實(shí)數(shù)。若您想防止用戶輸入除數(shù)字、小數(shù)點(diǎn)以外的任何其他字符,可對來自于鍵盤的Ascii值進(jìn)行判斷,有條件地接收,就實(shí)現(xiàn)了僅輸入數(shù)值字符。同理也可以限制只輸入字母字符。

根據(jù)這種思想,也可以對VB中一切不具有輸入功能,但具有KeyAscii或者KeyDown事件的控件進(jìn)行直接輸入,如標(biāo)簽Label等。

防止文本控件中的部分滾動

大家知道,WindowsAPI的SendMessage函數(shù)可以用來向VisualBasic

控件中發(fā)送消息,例如向文本框控件上發(fā)送消息?,F(xiàn)介紹如何利用該函數(shù)防止文本框控件中的部分文本滾動,即該控件中不能滾動的部分不能被用戶看見。發(fā)送消息到文本框控件

VisualBasic中的文本框控件就是一個(gè)最小化的字處理程序。當(dāng)該文本

控件的MultiLine屬性被設(shè)置為True的時(shí)候,則文本可以自動換行;當(dāng)在文本框控件中鍵入了大量文本時(shí),控件中的文本會向上滾動。這時(shí)文本就變得看不到了,但這些文本實(shí)際上依舊在控件中——它們并沒有被刪除。

WindowsAPI的SendMessage函數(shù)可以用來防止文本框控件中的文本滾動因而超出我們的視線。當(dāng)創(chuàng)立該文本框控件時(shí),它的客戶區(qū)域格式化為一個(gè)矩形(該區(qū)域就是鍵入文本的地方),可以給該控件發(fā)送EM_SETRECTNP消息,對該矩形區(qū)域進(jìn)行限制,以在文本框的客戶區(qū)域中指定一個(gè)特定區(qū)域。在下面的樣例程序中,我們希望文本控件的后一半原封不動地保持完整,

即不希望文本滾動而超出視線。可以從文本框控件的Height屬性中提取出它的高度,并將該值除以2,得到該文本框控件后一半的坐標(biāo)。然后將該結(jié)果傳遞給SendMessage函數(shù),告訴EM_SETRECTNP防止該矩形區(qū)域滾動。

有些程序員可能會希望使用EM_SETRECT消息代替EM_SETRECTNP消息。但是,使用EM_SETRECT消息會中止Windows對該格式化矩形區(qū)域中的文本的重新繪制,導(dǎo)致文本框控件中的文本會看不到。

樣例程序

該程序顯示了如何臨時(shí)凍結(jié)一個(gè)文本框控件中的特定部分,該部分包含的文本不能滾動,因而不會超出視線之外。

1.在VisualBasic中開始一個(gè)新的工程,采用缺省的方法建立Form1。

2.將如下常量和聲明語句添加到Form1的通用聲明部分中(注意該聲明語句需要書寫在一行內(nèi)):

PrivateDeclareFunctionSendMessageLib\(ByValhWndAsInteger,ByValwMsgAsInteger,ByValwParamAsInteger,lParamAsAny)AsLongConstWM_USER=&H400

ConstEM_SETRECTNP=WM_USER+4ConstEM_SETRECT=WM_USER+3

對于32位環(huán)境下使用VisualBasic5.0的用戶,需要將如下聲明語句添加到Form1的通用聲明部分中:

PrivateDeclareFunctionSendMessageLib\Alias\

wMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLongConstEM_SETRECTNP=&HB4ConstEM_SETRECT=&HB3

3.將如下代碼添加到Form1的Form_Load事件中:PrivateSubForm_Load()

Text1.Text=\這是我們希望顯示出來的第一段\Text1.Text=Text1.Text&\它位于文本框控件中\(zhòng)

Text1.Text=Text1.Text&Chr$(13)&Chr$(10)&\這是其次段,我們\Text1.Text=Text1.Text&\希望將之凍結(jié)以使文本不能滾動\EndSub

4.將如下代碼添加到Form1的Click事件中:PrivateSubForm_Click()DimRAsRECTDimXAsLongScaleMode=3R.Left=0R.Top=0

R.Right=Text1.Width

R.Bottom=Text1.Height/2

X=SendMessage(Text1.hWnd,EM_SETRECTNP,0,R)EndSub

5.創(chuàng)立一個(gè)新的模塊。采用缺省的方法建立Module1.Bas。6.將如下TYPE結(jié)構(gòu)添加到Module1.Bas中:TypeRECT

LeftAsIntegerTopAsIntegerRightAsIntegerBottomAsIntegerEndType

對于32位環(huán)境下使用VisualBasic5.0的用戶,需要將如下TYPE結(jié)構(gòu)添加到Module1.Bas中:TypeRECTLeftAsLongTopAsLongRightAsLongBottomAsLongEndType

7.在Form1上添加一個(gè)文本框控件,采用缺省的方法建立Text1,將其MultiLine屬性設(shè)置為True。

按下F5來執(zhí)行該程序,我們可以看到文本框顯示在Form1上。在窗體上單擊一次

鼠標(biāo),將新的文本鍵入到該文本框控件中。這時(shí)我們可以注意到,當(dāng)我們在文本框控件的開頭處鍵入新的文本時(shí),在文本框控件下半部分的文本不會滾動。

假使我們將EM_SETRECT消息替代EM_SETRECTNP消息發(fā)送給文本框,再次運(yùn)行該程序,這時(shí)我們會發(fā)現(xiàn),文本框的下半部分顯示不出來,盡管實(shí)際上文本依舊是存儲在控件中的。

防止用戶編輯文本框控件中的內(nèi)容

VisualBasic中的文本框控件允許用戶在其中鍵入文本,以便在程序中使用。

相反,程序員可能會希望顯示一些文本但不希望用戶編輯該文本。本文介紹了如何創(chuàng)立只讀的文本框控件的內(nèi)容。使一個(gè)文本框控件只讀

在VisualBasic中,假使文本框控件的MultiLine屬性設(shè)置為True,文本將會自動地?fù)Q行到下一行。另外,假使文本框控件的ScrollBars屬性設(shè)置為3-Both(或者1-Vertical,或者2-Horizontal),用戶還能夠滾動控件中的內(nèi)容。

程序員要想實(shí)現(xiàn)文本框控件中的文本不可編輯,可將文本框控件中的內(nèi)容設(shè)置為只讀狀態(tài),這可以通過使用MicrosoftWindows應(yīng)用程序編程接口(API)的SendMessage函數(shù)來實(shí)現(xiàn)。SendMessage函數(shù)可以用來發(fā)送一個(gè)EM_SETREADONLY消息到文本框控件中,這將使文本框控件變?yōu)橹蛔x。

要在程序中使用該SendMessage函數(shù),需要將如下的聲明語句包含在項(xiàng)目的通用聲明部分中(注意該聲明語句需要書寫在一行內(nèi)):

PrivateDeclareFunctionSendMessageLib\ByValwMsgAsLong,ByValwParamAsInteger,ByVallParamAsLong)AsLong該SendMessage函數(shù)需要4個(gè)參數(shù),如下所示:hwnd一個(gè)長整數(shù)值,它包含文本框控件的句柄。

wMsg一個(gè)長整數(shù)值,它包含被發(fā)送的消息,在這個(gè)例子里,是EM_SETREADONLY。wParam一個(gè)整數(shù)值,假使它為True,則控件被設(shè)置只讀標(biāo)記,假使它為False,則刪除控件的只讀標(biāo)記。

lParam一個(gè)長整數(shù)值,它應(yīng)當(dāng)被設(shè)置為0(EM_SETREADONLY不使用它)。在程序運(yùn)行了此SendMessage函數(shù)之后,將返回一個(gè)長整數(shù)值,指明調(diào)用成功(返回值非0)或是失?。ǚ祷刂禐?)。

樣例程序

該程序顯示了如何防止用戶編輯一個(gè)文本框控件中的內(nèi)容。

1.在VisualBasic中開始一個(gè)新的工程,采用缺省的方法建立Form1。

2.將如下的常量和聲明語句添加到Form1的通用聲明部分中(注意該聲明語句需要書寫在一行內(nèi)):

PrivateDeclareFunctionSendMessageLib\(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsInteger,ByVallParamAsLong)AsLongConstWM_USER=。

所以假使想要將RichTextBox中被選取的內(nèi)容復(fù)制到剪貼簿,只要對RichTextBox送出WM_COPY信息即可,以下是程序撰寫上的細(xì)節(jié):1.API函數(shù)的聲明式:ConstWM_PASTE=&H302ConstWM_CUT=&H300ConstWM_COPY=&H301

PrivateDeclareFunctionSendMessageLib\ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong

注:假使以上的聲明放在「一般模塊」底下,應(yīng)在Const之前加上Public保存字,并且將Private保存字去掉。2.調(diào)用例:

SendMessageRichTextBox1.hWnd,WM_COPY,0,ByVal0&

在ListBox之中,如何檢測鼠標(biāo)所在位置的選項(xiàng)?

我們可以利用ListIndex屬性得知ListBox的選項(xiàng),但是當(dāng)鼠標(biāo)移到某一個(gè)選項(xiàng)上面(但還沒有選取),如何得知此一選項(xiàng)呢?方法是對ListBox送出LB_ITEMFROMPOINT信息,細(xì)節(jié)如下:

1.API的聲明:

ConstLB_ITEMFROMPOINT=&H1A9

PrivateDeclareFunctionSendMessageLib\ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong

注:假使以上的聲明放在「一般模塊」底下,應(yīng)在Const之前加上Public保存字,并且將Private保存字去掉。

2.調(diào)用例:(在表單上布置一個(gè)TextBox及一個(gè)ListBox,然后利用MouseMove事件程序來檢測鼠標(biāo)所在位置的選項(xiàng))

PrivateSubList1_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)DimposAsLong,idxAsLong

pos=X/Screen.TwipsPerPixelX+Y/Screen.TwipsPerPixelY*65536idx=SendMessage(List1.hwnd,LB_ITEMFROMPOINT,0,ByValpos)'idx即等于鼠標(biāo)所在位置的選項(xiàng)

IfIdx0Then

ReDimbArr(length+1)AsByte,bArr2(length-1)AsByte

CallRtlMoveMemory(bArr(0),length,2)

CallSendMessage(hWnd,EM_GETLINE,whichLine,bArr(0))CallRtlMoveMemory(bArr2(0),bArr(0),length)Line=StrConv(bArr2,vbUnicode)ElseLine=\EndIfEndSub

'假設(shè)要讀取Text1第5行的資料DimSAsString

CallTB_GetLine(Text1.hWnd,5,S)'傳回值S即等于到5行的資料注:TextBox的行次是從0起算。

在VB中用定時(shí)控件實(shí)現(xiàn)長定時(shí)操作

Timer控件可用來在一定時(shí)間間隔執(zhí)行操作,然而,一個(gè)Timer控件的時(shí)間間隔取值最大為64.767毫秒,這意味著即使最長的時(shí)間間隔也不比一分鐘長多少(大約64.8秒),也就是說一個(gè)Timer控件只能響應(yīng)大約一分鐘之內(nèi)的事件。假使要響應(yīng)長時(shí)間的事件,例如,要開發(fā)一個(gè)學(xué)習(xí)系統(tǒng)的自我測試或考試過程,需要限制一個(gè)考試時(shí)間,一般都在10~150分鐘,開始自動計(jì)時(shí),時(shí)間到報(bào)警考試終止。則需多個(gè)Timer控件協(xié)同使用,這樣做顯得既繁瑣又不實(shí)用。其實(shí),可以只用一個(gè)Timer控件,在其Timer過程中使用一個(gè)計(jì)數(shù)器,從而響應(yīng)任意長時(shí)間間隔的事件。

下面是一個(gè)定時(shí)實(shí)例的部分代碼:控件

屬性設(shè)置的值Label1Caption

″請輸入限定時(shí)間(分鐘):″Text1Text″\

Command1Caption″確認(rèn)″Timer1Interval60000EnabledFalse

在窗體通用模塊General里聲明N、T兩個(gè)變量,N作為計(jì)數(shù)器,T用來存放限定時(shí)間。DIMNASIntegerDIMTASString

Command1-Click()

T=Text1.Text

Timer1.Enabled=True??EndSub

Timer1-Timer()N=N+1

ifn=val(T)ThenBeep

Timer1.Enabled=FalseEndifEndSub

將定時(shí)器的Interval屬性值設(shè)為60000,使得計(jì)數(shù)器每分鐘加1,當(dāng)然也可以設(shè)置為其他的值,如1000,這樣就使得計(jì)數(shù)器每秒鐘加1,但這樣要浪費(fèi)較多的系統(tǒng)時(shí)間。

處理多個(gè)具有一致要求的控件

我們往往有時(shí)需要處理多個(gè)具有一致特性的控件,如:把100個(gè)Text及Label的內(nèi)容加起來。這時(shí),我們可以使用下面的技巧:

1.假使是同一種類型的控件,我們可以使用控件組達(dá)到目標(biāo)。

2.假使不是同一類型控件,控件組就無法使用,這時(shí),我們還可以利用控件的Tag性,我們可以把每個(gè)控件設(shè)置一個(gè)Tag標(biāo)志。在程序中,我們可以用下面代碼來觀測是否是我們需要的控件:

ForI=0ToControls.Count-1

IfControls(I).Tag=\NextI

輸入限制確認(rèn)

在某些應(yīng)用程序中,我們需要限制在文本框或其它一些控件中只能輸入數(shù)字或一些特定的字符,現(xiàn)在我們可以通過下面的一個(gè)函數(shù)來實(shí)現(xiàn)此功能:

FunctionValiText(KeyInAsInteger,ValidateStringAsString,EditableAsBoolean)AsIntegerDimValidateListAsStringDimKeyOutAsIntegerIfEditable=TrueThen

ValidateList=Ucase(ValidateString)&Chr(8)Else

ValidateList=Ucase(ValidateString)EndIf

IfInStr(1,ValidateList,Ucase(Chr(KeyIn)),1)>0ThenKeyOut=KeyInElse

KeyOut=0BeepEndIf

ValiText=KeyOutEndFunction

在工程中參與此函數(shù)后,你就可以使用它了。

方法:在需要限制輸入的控件的KeyPress參與以下代碼:

KeyAscii=ValiText(Keyascii,\

現(xiàn)在你就可以過慮掉你不希望的字符了。在此例中,我們只接受其次個(gè)參數(shù)提供的字符,即:\

而此函數(shù)的第三個(gè)參數(shù)就決定了能否使用[Backspace]鍵。最終值得一提的是此函數(shù)對大小寫是不敏感的。

利用VB的圖片框?qū)崿F(xiàn)屏幕的滾動

對于學(xué)習(xí)使用VB來編程的電腦愛好者來說,可能會遇到這樣一個(gè)問題:就是如何實(shí)現(xiàn)屏幕的滾動,由于當(dāng)要顯示的內(nèi)容超出了屏幕的大小后,利用VB所提供的垂直滾動條和水平滾動條等控件是不可能直接實(shí)現(xiàn)這一特別顯示功能的。那么有沒有其它的方法呢?答案是確定的。我們知道VB的圖片框是用來顯示圖形的,但它還有大量其它用途,譬如可以用來創(chuàng)立一些動畫圖形等。其實(shí)對于上面的問題我們也可以利用圖片框來巧妙地解決。方法如下:首先,單擊工具框中的圖片框(PictureBox)控件和命令按鈕控件,在窗體(Form1)上建立圖片框?qū)ο驪icture1和命令按鈕對象Command1,將命令按鈕的Caption屬性設(shè)置為\退出\,Picture1的大小設(shè)置為顯示區(qū)域的大小,再單擊工具框中的圖片框控件,在Picture1上建立另一個(gè)圖片框?qū)ο驪icture2,將它的Left和Top屬性設(shè)置為0。用文本框,標(biāo)簽框等其它控件或?qū)胍环鶊D象在Picture2上設(shè)定具體的顯示內(nèi)容,當(dāng)然Picture2的大小一定要先調(diào)整到能全部容納所有要顯示的內(nèi)容,最終單擊工具框中的垂直滾動條控件和水平滾動條控件,在窗體(Form1)上分別建立垂直滾動條對象VScroll1和水平滾動條對象HScroll1,并設(shè)置好它們的屬性。至此在窗體(Form1)上的所有設(shè)置工作就完成了,下面是具體的程序代碼:PrivateSubVScroll1_Change()Picture2.Top=-VScroll1.ValueEndSub

PrivateSubHscroll1_Change()Picture2.Left=-HScroll1.ValueEndSub

PrivateSubCommand1_Click()EndEndSub

運(yùn)行程序,當(dāng)按下橫、豎滾動條時(shí),就能使顯示內(nèi)容實(shí)現(xiàn)左右、上下的滾動。此方法簡單易行,有興趣的朋友不妨試一試。VB中陰影字體的實(shí)現(xiàn)

VisualBasic確實(shí)是一種很不錯的應(yīng)用程序開發(fā)工具。筆者在使用中,也確實(shí)感到用VB設(shè)計(jì)程序,大量方法的實(shí)現(xiàn)是那么的簡單。有時(shí),僅僅需要幾條語句,就可實(shí)現(xiàn)一種方法、效果或功能。下面就介紹一下,陰影字體在VB中的實(shí)現(xiàn)。程序如下:PrivateSubForm-Click()CurrentX=700CurrentY=1000FontSize=30

ForeColor=QBColor(8)Print〞SoftwareWeekly〞CurrentX=750CurrentY=1050FontSize=30

ForeColor=QBColor(12)Print〞SoftwareWeekly〞EndSub

在屬性(properties)窗口中設(shè)置:Auto3D為trueFont選一種TrueType字體。

該程序是把代碼加到Form的Click事件中,通過先打印字體的陰影部分,再打印出字體,以實(shí)現(xiàn)陰影字體效果的。試運(yùn)行該程序,單擊窗體后,即浮現(xiàn)出陰影字體SoftwareWeekly。在VB中制作單獨(dú)程序封面的兩種方法這里所謂的單獨(dú)封面,是只獨(dú)立應(yīng)用程序窗口本身的一個(gè)窗口,這個(gè)窗口在程序運(yùn)行時(shí)首先彈出屏幕,用于裝飾程序本身,或簡單的演示一下程序的優(yōu)越性。這樣的封面在好多專業(yè)的WINDOWS程序中均存在,在VB中可有兩種簡單的方法實(shí)現(xiàn)這一功能。第一種方法:多窗體編程方法

此方法是尋常采用的方法,即在程序中創(chuàng)立兩個(gè)或兩個(gè)以上的Form窗體,把其中的一個(gè)作為專門的程序封面制作場所,具體方法:

1、創(chuàng)立一個(gè)新項(xiàng)目Form1,并在此窗體內(nèi)安放Command1命令按鈕,在Command1-Click()事件中輸入終止程序代碼“END〞。

2、單擊菜單的“Insert\項(xiàng)目,參與一個(gè)新窗體Form1。

3、雙擊Form1窗體空白處,在Form1-Load()事件中輸入如下代碼,用于隱蔽主窗體Form1,置其次窗體為最大模式,并在運(yùn)行程序首先顯示和二窗體:PrivateSubForm-Load()’隱蔽主窗口Form1.Visible=0’窗口2最大模式Form2.WindowState=2’顯示窗口2Form2.ShowEndSub

4、在窗體Form2中定義全程變量:Dimstrr1AsStringDimIAsInteger

5、在窗體Form2中放入一個(gè)時(shí)間控件Timer1。

6、在窗體Form2中的Form-Load()事件中輸入以下代碼,用于在窗體2中顯示圖像,并置時(shí)間控件頻率:

PrivateSubForm-Load()

Form2.Picture=LoadPicture(\Timer1.Interval=10I=0EndSub

7、在時(shí)間控件Timer1-Timer1()事件中進(jìn)行程序封面的制作工作,演示簡單的動畫,并控制此動畫運(yùn)行一段時(shí)間后自動中止,關(guān)閉程序封面,返回程序主窗口;下面的代碼實(shí)現(xiàn)在一個(gè)圖片上隨機(jī)顯示字符串,顯示30次字符串后自動退出。PrivateSubTimer1-Timer()Strr1=\程序封面演示“WithForm2

.Font.Transparent=True’透明顯示字符.Font.Size=Rnd*30+10’隨機(jī)變化字號.Font.Italic=True’斜體有效

.ForeColor=RGB(Rnd*256,Rnd*256,Rnd*256)’隨機(jī)變化前景

.FontName=Screen.Fonts(Rnd*7+14)’隨機(jī)變化字體EndWith

hh=Form2.TextHehght(strr1)’取字符串高度ww=Form2.TextWidth(strr1)’取字符串寬度x=Rnd*(Form2.ScaleWidth-ww)’隨機(jī)改變坐標(biāo)y=Rnd*(Form2.ScaleHeight-hh)Form2.CurrentX=xForm2.CurrentY=y

Form2.Printstrr1’顯示字符I=I+1’計(jì)數(shù)IfI>30Then

UnloadMe’關(guān)閉封面Form1.Show’調(diào)入主窗口

Timer1.Enabled=False’關(guān)閉時(shí)間控件EndIfEndSub

8、為了能夠人為地控制程序封面的停留時(shí)間,可在窗體Form2鼠標(biāo)單擊事件中安放退出封面代碼:

PrivateSubForm-Click()UnloadMeForm1.Show

Timer1.Enabled=False’關(guān)閉時(shí)間控件EndIfEndSub

至此工作全部完成,當(dāng)運(yùn)行程序時(shí),首先彈出程序封面,封面上顯示一幅·BMP圖像,之后在此圖像上進(jìn)行隨機(jī)字符串的顯示,字符串的位置、字體、字號、前風(fēng)景等值都是隨機(jī)變化的,顯示30次后自動關(guān)閉封面返回主窗口,演示過程中用鼠標(biāo)單擊窗口也會返回主窗口,在主窗口中按下終止按鈕退出程序。具體操作時(shí)還有好多其它技巧,譬如可以置其次個(gè)窗體為主窗體,這樣運(yùn)行時(shí)可自動先彈出程序封面,可省略隱蔽窗體和調(diào)入窗體的過程,另外其次窗體也可以在程序運(yùn)行時(shí)由代碼動態(tài)生成,這樣編程時(shí)繁雜一些,但有利于程序代碼的管理;程序封面的具體制作過程,有大量動態(tài)圖像控制方法可以使用,只要靈活動用VB的作圖方法,再加上一些必要的API函數(shù)的協(xié)同,會制作出理想的程序封面。

其次種方法:隱蔽控件方法

多窗口編程存在著一定的繁雜性,需要對多個(gè)窗體的·Frm文件進(jìn)行管理,編碼時(shí)還需要頻繁地在多個(gè)窗口間進(jìn)行轉(zhuǎn)換。實(shí)際上通過一個(gè)窗體也可以編制出類似的封面效果?;驹砭褪窃诔绦蜻\(yùn)行時(shí)首先通過VISIBLE屬性隱蔽全部控件,然后在主窗體內(nèi)進(jìn)行程序封面設(shè)計(jì)和演示,延時(shí)一定時(shí)間再恢復(fù)所有控件的顯示,即達(dá)到了獨(dú)立程序封面的制作過程。由于窗體內(nèi)的控件好多,逐一隱蔽或顯示十分繁瑣,可采用容器控件簡化操作過程,即把控件全部放到Frame1等控件上,這樣只要執(zhí)行Frame1.Visible=0,即可使其上面的所有控件隱蔽起來。C由于程序只涉及一個(gè)窗體,程序設(shè)計(jì)的大部分工作只是編碼過程,所以不再分步介紹。在窗體Form1中安放一個(gè)時(shí)間控件Timer1和一個(gè)容器控件Frame1,再在Frame1上安放一個(gè)命令按鈕Command1,具體程序設(shè)計(jì)時(shí)可把所有主程序工作控件放在Frame1上;之后把下面

的代碼填入相應(yīng)的事件之中即可完成全部程序設(shè)計(jì)工作。運(yùn)行此程序后首先在全屏幕窗體內(nèi)顯示圖像,并從左上角開始逐漸放大字符串“程序封面演示〞,放大過程中顏色發(fā)生平滑變化,形成美麗的拖尾效果,連續(xù)顯示5次后自動關(guān)閉封面,返回主程序窗口,同樣馬上關(guān)閉程序封面,返回主程序窗口,單擊主窗體中的命令按鈕退出程序?!x全程變量DimI,jAsInteger’退出程序按鈕

PrivateSubCommand1-Click()EndEndSub

’單擊窗體關(guān)閉封面PrivateSubForm-Click()

Frame1.Visible=1’恢復(fù)容器控件timer1.Enabled=False’關(guān)閉時(shí)間控件

Form1.WindowState=0’恢復(fù)缺省窗口模式EndSub

’準(zhǔn)備工作

PrivateSubForm-Load()

Form1.WindowState=2’窗口最大化

Frame1.Width=Form1.Width’調(diào)整容器控件尺寸Frame1.Height=Form1.Height

Frame1.Top=0’調(diào)整容器控件位置Frame1.Left=0

Frame1.Visible=0’隱蔽容器控件timer1.Interval=10’置時(shí)間頻率

Form1.Picture=LoadPicture(\’裝入圖像Form1.ScaleMode=3’置坐標(biāo)刻度

Form1.FontName=“黑體〞’置字體名稱EndSub

’封面制作(動畫演示)PrivateSubtimer1-Timer()Strr=\程序封面演示\WithForm1’透明顯示.Font.Transparent=True

.Font.Size=I+1’放大字號.Font.Italic=True’斜體有效

.ForeColor=RGB(I*3,56,256-I*3)’平滑變化顏色EndWithstring=strr

Form1.CurrentX=I’連續(xù)改變坐標(biāo)Form1.CurrentY=I

Form1.Printstringg’顯示字符串I=I+1

IfI>72Then’放大到72號字

j=j+1’循環(huán)計(jì)數(shù)I=0

Form1.CurrentX=72Form1.CurrentY=72

Form1.ForeColor=RGB(255,56,0)’重新顯示一次字符Form1.PrintstringgEndIf

Ifj=5Then’動畫計(jì)數(shù)

Frame1.Visible=1’顯示容器控件timer1.Enabled=False’關(guān)閉時(shí)間控件Form1.WindowState=0’恢復(fù)窗口模式EndIfEndSub

以上方法及程序在WINDOWS95/98系統(tǒng)下,在VB5.0/6.0環(huán)境下調(diào)試通過。用MSGBOX函數(shù)設(shè)計(jì)版權(quán)信息

MsgBox函數(shù)可用來設(shè)計(jì)簡易的版權(quán)信息,它只能顯示文本,假使要求不高的話可采用它,優(yōu)點(diǎn)是十分便利,譬如在菜單ABOUT項(xiàng)中顯示版權(quán)信息。MsgBox函數(shù)的用法如下:MsgBoxmsg[,[type][,title]]msg—需要顯示的文字信息,如版權(quán)信息。Type—按鈕顯示選擇項(xiàng)。

如0只顯示OK按鈕(確省選擇),4顯示Yes和No按鈕title—標(biāo)題文字信息。

MSGBOX最多能顯示1024個(gè)字符,超出的將被截去;它可自動換行,假使你想強(qiáng)制換行的話需要在換行處參與換行符CHR(10)。例子:

SubForm_Click()

Msg1=〞Copyright(c)1996〞&Chr(10)&〞Ver1.0〞’分兩行顯示

MsgBoxMsg1,0,〞Copyrightdemo〞’只顯示一個(gè)OK按鈕EndSub

巧用VisualBasic的RND()函數(shù)

VisualBasic的RND()函數(shù)有一個(gè)重要的特征:當(dāng)RND()的參數(shù)(我們稱這里可以稱它為種子)為負(fù)值時(shí),同一種子(負(fù)值)產(chǎn)生同一個(gè)隨機(jī)數(shù)序列。同時(shí)VisualBasic還具有強(qiáng)大的二進(jìn)制技術(shù)功能,這樣我們可以按以下思路實(shí)現(xiàn)文件內(nèi)容加密:X=RND(-KEY)’KEY為正數(shù)

VAULE=INT(256*RND)’產(chǎn)生一個(gè)隨機(jī)數(shù)(以此為密碼)OpenFILENAME$ForBinaryAs#FILENUM’開啟文件Get#FILENUM,I,A’取文件內(nèi)容B=AXORVAULE’得到加密文件結(jié)合

C=BXORVAULE’得到解密文件(B為加密后文件內(nèi)容)

注意:這里的A非整個(gè)文件內(nèi)容,可以是極少部分、幾個(gè)字節(jié)甚至單個(gè)字節(jié),若為單字節(jié),則文件中的每個(gè)字節(jié)同不同的數(shù)異或,破譯難度可見有多么大。具體過程:SubENDECODE(FILENAME$,MA,FILE2$)'參數(shù)為:源文件,密碼,目標(biāo)文件

DimFILENUMAsInteger,XAsSingle,IAsSingle

DimCHARNUMAsInteger,RANDOMINTEGERAsIntegerDimSINGLECHARAsString*1,filen2AsInteger'取單字節(jié)IfMA=#12:00:00AM#AndTime=#12:00:00PM#AndTime=#6:00:00PM#ThenRightNow=EveningEndIfEndSub

防止自身屢屢運(yùn)行

由于WINDOWS的多任務(wù)處理功能,有些程序可能開啟后忘掉了,下次用時(shí)還可能再開啟,這樣做會占用系統(tǒng)資源降低系統(tǒng)效率。為了防止自身被屢屢運(yùn)行,可利用VB應(yīng)用對象提供的PrevInstance屬性來檢測內(nèi)存中是否已有一個(gè)自身的副本,若有則給出提醒后終止。一般將檢測代碼放在FORM_LOAD()中,由于程序一運(yùn)行就要檢測。代碼如下:

subform_load()

ifApp.PrevInstancethen

msg$=App.Exename&〞hasalreadyrun〞

msgboxmsg$,48’給出程序已運(yùn)行的提醒和一驚嘆號以示警告endendifendsub

格式化輸入

在數(shù)據(jù)輸入過程中,有些數(shù)據(jù)要求一定的格式,譬如限制輸入的只能為數(shù)字或英文字符,這可用VB的格式輸入文本框來實(shí)現(xiàn)。它與文本框(TEXTBOX)功能基本相像,但多了一個(gè)MASK屬性,MASK屬性常用的設(shè)定如下:?!薅▋H能輸入數(shù)字0~9;A—限定輸入為英文字符及數(shù)字;?—限定僅能輸入英文字符;.—限定小數(shù)點(diǎn)位置;:—限定時(shí)間分隔號;/—限定日期分隔號

不需編寫代碼,只要在設(shè)計(jì)時(shí)將格式化文本框?qū)ο螅∕ASKEDEDIT)的MASK屬性設(shè)計(jì)好所需格式即可。譬如##-##-##可輸入12-11-96。

使用IIF和SWITCH以精減代碼

在好多地方你都可以使用一個(gè)更緊湊的Iif函數(shù)來代替If?Else?Endif的結(jié)構(gòu):例:返回兩個(gè)值中較大的一個(gè)maxValue=Iif(first>=second,first,second)

Switch則是一個(gè)很少

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論