VB编程小技巧_第1页
VB编程小技巧_第2页
VB编程小技巧_第3页
VB编程小技巧_第4页
VB编程小技巧_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VB1、如何防止程式重复执行?(侦测是否存在前一副本,假设有,那么结束目前新启动的程式)2、如何让一个app永远保持在最上层( Always on Top )3、表单配置视窗和解析度4、连续变量的声明Dim a, b, c as string * 45、正确的除错(Debug)方式1、如何防止程式重复执行?(侦测是否存在前一副本,假设有,那么结束目前新启动的程式)使用者在启动程式后,有时会将程式缩小在工作列上,之后要用时,又会重新启动一次程式,资料库程式有时会因此造成资料错乱!假设您不希望使用者重复启动程式,您可以使用APP物件来判断,方法如下:Private Sub Form_Load()I

2、f App.PrevInstance Then 检视前一版本MsgBox 此程式已经在执行中!, 48EndEnd IfEnd Sub2、如何让一个app永远保持在最上层( Always on Top )请在声明区中参加以下声明Private Declare Function SetWindowPos Lib user32 _(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _ByVal x As Long, ByVal y As Long, ByVal cx As Long, _ByVal cy As Long, ByVal wFlags

3、 As Long) As LongConst SWP_NOMOVE = &H2不更动目前视窗位置Const SWP_NOSIZE = &H1 不更动目前视窗大小Const HWND_TOPMOST = -1 设定为最上层Const HWND_NOTOPMOST = -2取消最上层设定Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE将APP视窗设定成永远保持在最上层SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS取消最上层设定SetWindowPos Me.hwnd, HWND_NOTOPMOS

4、T, 0, 0, 0, 0, FLAGS3、表单配置视窗和解析度这个地方不是要告诉您如何写出一支程式,会自动根据使用者荧幕的解析度调整Form及各控制项的大小,也就是适用于各种解析度的程式。那是另一个主题!由于我在集团式的公司资讯中心上班,在我的开发过程中,我的使用者依不同公司别,分成几个族群,有的公司都是使用640 x480的解析度,有的都用800 x600, 设计公司那么是1024x768, 为了替这些公司开发软件,在VB5.0以前,写各家公司的程式以前就必须先调整荧幕的解析度(否那么在解析度800 x600的电脑上开发的程式,在640 x480解析度的电脑中执行时,右方和下方的画面会跑出

5、荧幕外面), 有的电脑一改变解析度就必须重新开机,更是麻烦!VB5.0以后,VB多提供了一个功能,就是【表单配置视窗】,从此以后,您可以在高解析度的荧幕中,开发低解析度的程式,要怎么做呢??假设您的电脑解析度是1024x768?很简单!在【表单配置视窗】上的荧幕上按滑数右键,选择【解析度】。看到了吗!在【表单配置视窗】上的荧幕上, 出现了二个虚线框,上面各标明了640 x480及800 x600。 好了! 现在您可以开始开发各种不同解析度的系统了!编程各个突破例如您要开发的系统,解析度是640 x480,您只要注意不要让您的表单超出640 x480的虚线框就可以了!4、连续变量的声明Dim a

6、, b, c as string * 4我想声明a,b,c三个字串变量Dim a, b, c as string * 4 (错的)这样的声明在VB中,结果可能和您要的不同!有些程式语言,例如C,类似以上的声明表示三个字串变量。但是在VB中却不是如此!以上的声明在VB中表示声明了a,b 2个variant (不定形态变量),以及c这个字串变量。要声明a,b,c三个字串变量,正确的写法如下:Dim a as string * 4Dim b as string * 4Dim c as string * 4假设想写在同一行,也可以,写法如下:Dim a as string * 4, b as stri

7、ng * 4, c as string * 45、正确的除错(Debug)方式当程式执行起来怪怪的,很多人在除错(Debug)时,都喜欢在程式中使用中断点(Break)加上MsgBox来看执行结果,但有些时候,这样子的作法会造成某些事件(Event)无法触发,甚至改变事件原来触发的顺序!比拟正确的作法是在程式中使用Debug.Print 事件名称/要显示的讯息,而不要用中断点(Break)。6、Move Method速度较快7、哇!我的变量名称变成了保存字!8、快捷键-找寻Function/Subroutine9、我上一次程序写到那里呢?10、不方便的Msdn - VB6.0的Help6、Mo

8、ve Method速度较快当我们要移动控制项(Control)或表单(Form)时,很多人习惯这样写:frmCustomer.Left = frmCustomer.Left + 100frmCustomer.Top = frmCustomer.Top + 50但是假设使用Move Method,可以加快40%:frmCustomer.Move frmCustomer.Left + 100, frmCustomer.Top + 507、哇!我的变量名称变成了保存字!当我们升级VB的版本时,有时候会因为以前程序中使用的变量名称或函数名称变成了保存字,而使程序跑起来完全不正常,例如:print:VB

9、3时不是保存字,但到了VB4却变成了保存字。Array:VB4时不是保存字,但到了VB5却变成了保存字。遇到这种情形,其实也很简单!只要在VB中叫出该工程,翻开任何一个表单的程序码,选择【编辑功能表】中的【取代】,搜寻范围设定成【整个工程】,并将【全字拼写须符合】选项打勾,然后将该工程中该字串改成另一个新字串,再重新Make成执行档即可。下一次您升级VB的版本时,假设原来正常的程序跑起来变得怪怪的,别忘了检查一下您自己定义的变数名称或函数名称是否也变成了保存字!8、快捷键-找寻Function/Subroutine当您的APP愈来愈大时, 或是您要维护别人开发的大系统时, 是否曾经有过一种情形

10、, 程序中call了某一个Function/Subroutine,您要找寻这个Function/Subroutine,除了一个一个Module找之外,大部份的人都是使用【编辑功能表】的【搜寻】功能。其实您可以使用【Shift + F2】快捷键!很简单,方法如下:只要将鼠标停留在程序中该Function/Subroutine Name上,再使用【Shift + F2】快捷键即可!9、我上一次程序写到那里呢?有时候您会同时写几个不同的程序,或因为某种原因,程序停了一段时间,当您下一次要再继续写时,已经忘了上次写到那里了,其实有一个很简单的方法,可以马上唤起您的记忆!在您在写程序中要停下时,先随便写

11、一行注解,但是拿掉注解符号后存档,下一次您载入工程后,马上使用【执行功能表】中的【全部编译后开始】,此时第一个错误的地方使是上次程序中断的地方!10、不方便的Msdn - VB6.0的Help很多VB程序设计师抱怨为了存取VB6.0的Help,必须一直将Msdn光碟放在光碟机中,否那么就必须安装680MB的Help到硬盘中!其实还有一个比拟人性化的方法, 就是在安装Msdn时, 选择 【自订安装】, 然后只要选择Visual Basic文件(13792K)即可。如此您便可以直接由硬盘存取VB的相关主题,假设您想看其他非VB主题,再由光碟存取。11、如何快速设定Form上所有控制项的TabInd

12、ex顺序12、Boolean值的转换13、呼叫子程序(Subroutine)14、输入时,自动转换成大写?15、输入时,自动转换成小写?11、如何快速设定Form上所有控制项的TabIndex顺序由于在设计Form上的控制项时,不一定会依照输入的顺序,在完成设计之后,我们通常会重设各控制项的TabIndex顺序,当当麻烦,常常还会设错。有一个很简单又不容易出错的方法,是从画面上的右下角往左上角(方向是先向左再往上),逐一的将控制项的TabIndex属性设1:右手用滑鼠点一下右下角的控制项,左手按F4,将TabIndex设成0。2:右手往左用滑鼠点一下倒数第二个控制项,左手按F4,左手按0。3:

13、右手往左用滑鼠点一下倒数第三个控制项,左手按F4,左手按0。4:重复以上动作直到左上角第一个控制项为止。好了,您已经设定好整个Form上所有控制项的TabIndex顺序了!其原理就是当您设定一个控制项的TabIndex为0时,原来变成了1、而1的变成2,依序+1改变。12、Boolean值的转换我们都知道Boolean这个资料形态只有True/False二种值,但是当我们要存到资料库时,我们常常会将它转成数值,您可以直使用函数转换,很可能会用Val(),但是小心,其结果是错的!您必须使用Abs()或Cint(),为什么呢?看结果就知道了!Val(True)结果是0Cint(True)结果是-1

14、Abs(True)结果是113、呼叫子程序(Subroutine)当我们呼叫子程序(Subroutine)时,有二种方法:1、 Call MyRoutine(参数)2、 MyRoutine参数注意第二个方法不可以使用括号(),否那么VB会误认为是运算子,本来应该是传址(Reference),就会变成了传值(Value)!看Call MyRoutine(Text1)正确意思是要将Text1这个控制项传入MyRoutine中,但是如果拿掉Call这个字,VB传给MyRoutine的却变成了Text1的内含MyRoutine(Text1)错误MyRoutine要的本来是一个控制项,结果却传入了一个字

15、串,您会得到一个?type-mismatch /资料型态不符?14、输入时,自动转换成大写?要自动转换大小写,很多人首先想到的一定是Ucase$及Lcase$, 但是要使用这二个函数,一定不可以在Key_Press事件中使用,为什么呢?因为当您输入a之后,Ucase$会替您转换成A,但是转换完后,滑鼠的游标会停在A的前面,您继续输入b,变成了bA, Uc的游标又停在BA的前面,您继续输入c,变成了cBA,Ucase$又替您转换成CBA!假设您不相信,可以自己试试在Key_Press中正确的作法,是判断它的参数KeyAscii!A的Asc值是97,A的Asc值是65,所以要自动将小写转成大写Pr

16、ivate Sub Text2_KeyPress(KeyAscii As Integer)If KeyAscii = 97 And KeyAscii = 65 And KeyAscii 10Set db = OpenDatabase(c:vbbiblio.mdb)Set ds = db.CreateSnapshot(wsql)iNum = ds(0)MsgBox 总笔数为 + Str$(iNum)End Sub怎么样,是不是一样呢,只差在一个是ADO,一个是DAO而已!31、程序启动时,如何自动判断 Access 资料库是否损毁并自动修复?32、如何让程序在 Windows 启动时自动执行?3

17、3、如何让程序在新 User Login时自动执行?34、已将 TextBox 的 Alignment 属性设为1-靠右对 (1- RightJustify) ,但文字却未向右靠?35、在TextBox 中如何限制只能输入数字?31、程序启动时,如何自动判断 Access 资料库是否损毁并自动修复?假设程序使用Access 资料库开发,当Access 资料库损毁时,一进入程序,便会出现以下讯息:Cant open database name. It may not be a database that your application recognizes, or the fil假设是程序中未

18、参加错误判断,程序便会中断跳出,这会给予使用者极不好的印象,要防止这种情形,甚至不让使下之程序码加以判断:Private Sub Form_Load()Dim db As DatabaseOn Error GoTo error1Set db = OpenDatabase(c:test.mdb)On Error GoTo 0: 正常程序开始Exit Sub error1:If Err = 3049 Then 资料库损毁DBEngine.RepairDatabase C:test.mdb ResumeElseMsgBox Err & Error(Err)End If32、如何让程序在 Wi

19、ndows 启动时自动执行?有以下二个方法:方法 1: 直接将快捷方式放到启动群组中。方法 2:在注册档 HKEY_LOCAL_MACHIN E 找到以下机码 SoftwareMicrosoftWindowsCurrentVersionRun 新增一个字串值,包括二个部份1. 名称部份:自己取名,可设定为AP 名称。2. 资料部份:那么是包含 全路径档案名称 及 执行参数例如:Value Name = NotepadValue Data = c:windowsnotepad.exe33、如何让程序在新 User Login 时自动执行?在注册表中 HKEY_CURRENT_USER 至 IJ

20、以下代码SoftwareMicrosoftWindowsCurrentVersionRun新增一个字串值,包括二个部份1. 名称部份:自己取名,可设定为AP 名称。2. 资料部份:那么是包含 全路径档案名称 及 执行参数例如:Value Name = NotepadValue Data = c:windowsnotepad.exe34、已将TextBox 的 Alignment 属性设为1-靠右对 (1- RightJustify) ,但文字却未向右靠?欲将 TextBox 内的文字向右靠,除了将Alignment 属性设为 1-靠右对之外,亦将 MultiLine 属性设但是假设您希望只有单

21、行,不要多行, 那么必须判断User 是否按了Enter Key , 那只好在TextBox 的 KeyPress 中作用:Private Sub Text1_KeyPress(KeyAscii As Integer)If KeyAscii = vbKeyReturn ThenKeyAscii = 0End If35、在 TextBox 中如何限制只能输入数字?参考以下程序:Sub Text1_KeyPress(KeyAscii As Integer)If KeyAscii 57 ThenKeyAscii = 0End IfEnd Sub36、我希望TextBox中能不接受某些特定字符,例如#

22、$%,有没有简单一点的写法?37、如何让鼠标进入TextBox时自动选定TextBox中之整串文字?38、如何让TextBox由Insert模式变成Overwrite模式?39、如何使TextBox变成只读,卷动杆可卷动,但是不出现游标,也不可被选定反白?40、文字框可以设定快捷键吗?36、我希望TextBox中能不接受某些特定字符,例如#$%,有没有简单一点的写法?方法有好几种,以以下举二种:方法1:可以使用IF或Select Case一个个判断,但如果不接受的字符多时,较麻烦!方法2:将要剔除的字符统统放在一个字串中,只要一个IF判断即可!如下:Private Sub Text1_KeyP

23、ress(KeyAscii As Integer)Dim sTemplate As StringsTemplate= !#$%人&*()_+-=用来存放不接受的字符If InStr(1, sTemplate, Chr(KeyAscii) 0 ThenKeyAscii = 0End IfEnd Sub37、如何让鼠标进入TextBox时自动选定TextBox中之整串文字?这个自动选定反白整串文字的动作,会使得输入的资料完全取代之前在TextBox中的所有字符。Private Sub Text1_GotFocus()Text1.SelStart = 0Text1.SelLength = L

24、en(Text1)End Sub38、如何让TextBox由Insert模式变成Overwrite模式?Windows的TextBox一直都只支援Insert Mode,而不支援OverStrike(OverWrite) Mode,其实,只要在Key_Press事件中加上几行指令,就可以做到OverStrike功能!以下的程式码中,只设定SelLength=1,而SelStart假设未指定那么会一直跟著滑鼠的游标所在处,设定SelLength=1会反白游标所在处的下一个字,但是由于您输入的字元会直接取代该反白的字元(都同时在Key_Press发生), 所以您并不会看到字符被选定反白(Marke

25、d), 假设是游标已在字串的最后面, 那么会直接忽略这个动作。以下的程式码中同时也作了以下的错误判断及预防:1.当输入的是退格符,也就是Backspace (character 8)。2.当输入的是return键(character 13)。3.事先已作了选定动作(Marked)。Sub Text1_KeyPress(KeyAscii As Integer)If KeyAscii 8 And KeyAscii 13 And Text1.SelLength = 0 ThenText1.SelLength = 1End IfEnd Sub39、如何使TextBox变成只读,卷动杆可卷动,但是不出现

26、游标,也不可被选定反白?在Form中放一个TextBox,设定Locked = True,MultiLine = True,ScrollBar = 2 - Vertical。另外再放一个CommandButton (或其他任何可接受Focus的物件),此物件可由您自行作其他用途,否那么设定Command1.left = -1000将其移到Form的外面。程式码如下:Private Sub Text1_GotFocus()马上将Text1的focus转移到Command1或其他物件上Command1.SetFocusEnd Sub40、文字框可以设定快捷键吗?不行, 要设定快捷键的先决条件,是该

27、物件必须有Caption属性,但是TextBox 文字框只有Text属性,并无Caption属性,所以文字框本身是不能设定快捷键的!完全没方法吗?但是还是有方法的!人家说山不转路转,文字框本身不能设定快捷键,一般我们在文字框的左方都会放置说明用的Label,那我们就借用Label来做到这个功能,作法如下:1、将文字框的TabIndex设成说明用的Label物件的下一个。2、设定Label物件的快捷键,奇怪吗?Label物件没有Focus好似不要快捷键!没错,我们就是要利用Label物件不要快捷键的特性来到达我们的要求!当您输入了Label物件的快捷键,由于Label物件没有Focus不接受快捷

28、键,于是它立刻将Focus送到下一个TabIndex的物件,也就是TextBox文字框了!41、 假设画面上ListBox中可显示的工程数量为5条,而ListBox中的资料总数已超过5条, 如何让新参加ListBox的工程能够马上显示在ListBox的最后一条画面上显示最后5条, 含新参加之资料?42、如何事先选定ListBox或ComboBox的某一个Item?43、模拟IE的 地址栏:智慧型下拉式Combo44、如何让ListBox同一列显示二栏以上的栏位?45、如何控制二栏以上ListBox之各栏位宽度?41、假设画面上ListBox中可显示的工程数量为5条,而ListBox中的资料总数

29、已超过5条,如何让新参加ListBox的工程能够马上显示在ListBox的最后一条画面上显示最后5条, 含新参加之资料?使用TopIndex配合ListCount属性即可,而且不会更改原来的选取状态。List1.AddItem xxx xxx指新参加之资料List1.TopIndex = List1.ListCount - n n=5就是画面上ListBox可看到的条数42、如何事先选定ListBox或ComboBox的某一个Item?有二个方法:方法1:使用For Loop一一比对,再设定ListIndex即可,只是工程多时比方法2慢。例如:Dim I As IntegerFor I = 0

30、 To List1.ListCount - 1If List1.List(I) = 搜寻的字串 ThenList1.ListIndex = IExit ForEnd IfNext方法2: 16位版本:Declare Function SendMessage Lib User _(ByVal hWnd As Integer, ByVal wMsg As Integer, _ByVal wParam As Integer, lParam As Any) As LongConst WM_USER = &H400Const LB_SELECTSTRING = (WM_USER + 13)Con

31、st CB_SELECTSTRING = (WM_USER + 13)32位版本:( Integer改成Long )Declare Function SendMessage Lib user32 Alias _SendMessageA (ByVal hwnd As Long, ByVal wMsg As Long, _ByVal wParam As Long, lParam As Any) As LongConst WM_USER = &H400Const LB_SELECTSTRING = &H18CConst CB_SELECTSTRING = &H14DSub S

32、electListItem(lst As Control, Idx As String)Dim I As LongIf TypeOf lst Is ComboBox ThenI = SendMessage(lst.hwnd, CB_SELECTSTRING, -1, ByVal Idx)ElseI = SendMessage(lst.hwnd, LB_SELECTSTRING, -1, ByVal Idx)End IfEnd Sub在必要的时候,例如Form_Load,只要call SelectListItem(ControlName, StringToFind)即可,不管是ListBox或C

33、ombobox,本范例都适用。43、模拟IE的 地址栏:智慧型下拉式Combo不知您是否有注意到?您在IE的地址栏直接输入地址的时候,如果您输入的地址前面几位和下拉式Combo中现存的地址相同时,IE便会自动带出该地址资料放在Combo的Text框中, 而且这串字有一个特性,在滑鼠游标之前的字是未选定反白的,而在滑鼠游标之后的字那么是已经选定反白的,它的目的有二个:1.如果您要输入的整串字和它带出的字完全一样,就可以不用再输入,可以节省时间。2.如果您要输入的整串字和它带出的字不一样, 您还是可以继续输入,继续输入的字串会自动取代后面那串已经选定反白的字串。以下的范例, 只处理英文字,假设要处

34、理其他情形如数字,请自行略加更改,请先在Form1中放一个Combo,然后将以下程式直接Copy进去即可:Dim strCombo As StringConst WM_SETREDRAW = &HBConst KEY_A = 65Const KEY_Z = 90Private Declare Function SendMessage Lib user32 Alias _ SendMessageA (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long,lParam As Any) As LongPrivate Su

35、b combo1_KeyUp(KeyCode As Integer, Shift As Integer)Dim x%Dim strTemp$Dim nRet&If KeyCode = KEY_A And KeyCode = KEY_Z Thenonly look at letters A-ZstrTemp = Combo1.TextIf Len(strTemp) = 1 Then strCombo = strTempnRet& = SendMessage(Combo1.hwnd, WM_SETREDRAW, False, 0&)For x = 0 To (Combo1.

36、ListCount - 1)If Ucase(strTemp & Mid$(Combo1.List(x), Len(strTemp) _+ 1) = Ucase(Combo1.List(x) ThenCombo1.ListIndex = xCombo1.Text = Combo1.List(x)Combo1.SelStart = Len(strTemp)Combo1.SelLength = Len(Combo1.Text) - (Len(strTemp) strCombo = strCombo & Mid$(strTemp, Len(strCombo) + 1)Exit For

37、ElseIf InStr(Ucase(strTemp), Ucase(strCombo) ThenstrCombo = strCombo & Mid$(strTemp, Len(strCombo) + 1)Combo1.Text = strComboCombo1.SelStart = Len(Combo1.Text)ElsestrCombo = strTempEnd IfEnd IfNextnRet& = SendMessage(Combo1.hwnd, WM_SETREDRAW, True, 0&) End IfEnd SubPrivate Sub Form_Load

38、()Combo1.AddItem AAAAAAAACombo1.AddItem ABBBBBBBCombo1.AddItem ABCCCCCCCombo1.AddItem ABCDDDDDCombo1.AddItem ABCDEEEECombo1.AddItem ABCDEFFFCombo1.AddItem ABCDEFGGCombo1.AddItem ABCDEFGHEnd Sub44、如何让ListBox同一列显示二栏以上的栏位? 要让ListBox显示二栏以上,有很多方法:有人用二个字串中间加上空白来AddItem,但是这样有一个很大的缺点,就是第二栏常常无法对齐!有人说可以加上Form

39、at来强迫留白,以便对齐,但是这些方法都比拟麻烦,没有效率!有一个很简单,又保证不用伤脑筋就可以对的方法,就是使用vbTab!作法如下:lstMyListBox.AddItem 0001 & vbTab & lstMyListBox.AddItem 0002 & vbTab & lstMyListBox.AddItem 0003 & vbTab & lstMyListBox.AddItem 0004 & vbTab & 45、如何控制二栏以上ListBox之各栏位宽度?使用vbTab来设定ListBox的多栏显示,效果不错,但是假

40、设以vbTab来做, 每栏长度是固定的,只有8,我的资料有些字串很长,有些很短,如果可以逐栏设定宽度,那就太完美了!但是单用VB的根本函数,是做不到的!不过我们可以Call API:假设要放到ListBox的资料有四个栏位,如下:1、员工编号长度为62、员工姓名长度为63、员工住址长度为384、员工性别长为4Const LB_SETTABSTOPS = &H192Private Declare Function SendMessage Lib user32 Alias _SendMessageA ByVal hwnd As Long, ByVal wMsg As Long, _ByVa

41、l wParam As Long, lParam As Any As LongSub SetListTabStopsiListHandle As Long设定四个栏位,长度各为6,6,38,4王一 & vbTab & 广州市丁二 & vbTab & 上海市张三 & vbTab & 北京市李四 & vbTab & 重庆市iListHandle = the window handle of the list boxDim iNumColumns As LongDim iListTabs(3) As LongDim Ret As Lon

42、g iNumColumns = 4iListTabs(0) = 24 24/4 = 6( iListTabs(1) = 48 48/4 = 12( iListTabs(2) = 200 200/4 = 50( iListTabs(3) = 216 216/4 = 54 (Ret = SendMessage(iListHandle,LB_SETTABSTOPS, _ iNumColumns,iListTabs(0)End SubPrivate Sub Form_Load()Call SetListTabStops(List1.hwnd)List1.AddItem 0001 & vbTab

43、 & 王一 & vbTab & _广州市市体育东路二段120巷176号 & vbTab & 男List1.AddItem 0002 & vbTab & 丁二 & vbTab & _北京市中关村路100号 & vbTab & 男List1.AddItem 0003 & vbTab & 张三 & vbTab & _上海市中山路150巷26号 & vbTab & 女List1.AddItem 0004 & vbTab & 李四 & vbTab

44、 & _重庆市福州路99号 & vbTab & 男End Sub 46、ListBox选项资料太长,如何设定ListBox的水平卷动轴?47、ListBox选项资料太长,如何使用ToolTip来显示内容?48、如何加长ComboBox的下拉选单?49、如何加宽ComboBox的下拉选单?50、如何用程序控制滑鼠游标(Mouse Cursor)到指定位置?46、ListBox选项资料太长,如何设定ListBox的水平卷动轴?VB的ListBox并没有水平卷动轴的功能,如果遇到某一个资料项很长时,使用者就无法看到这一个资料项的所有内容,要如何设定水平卷动轴给ListBox?

45、可禾U用SendMessage传送LB_SETHORIZONTALEXTENT息给ListBox,此一讯息的作用就是要求ListBox设定水平卷动轴,细节如下:1. API的声明:16位Const WM_USER = &H400Const LB_SETHORIZONTALEXTENT = (WM_USER + 21)Private Declare Function SendMessage Lib User (ByVal hWnd As Integer, _ ByVal wMsg As Integer, ByVal wParam As Integer, lParam As AnyAs L

46、ong32位第1-第6字节)第7-第12字节)第13-第50字节)第51-第54字节Const LB_SETHORIZONTALEXTENT = &H194Private Declare Function SendMessage Lib user32 Alias SendMessageA _ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _lParam As Any As Long2.程序范例: List1为ListBox的名称Call SendMessageList1.hwnd, LB_SETHORIZONT

47、ALEXTENT,水平卷动轴的宽度, ByVal 0&特别注意:以上的水平卷动轴宽度的单位是pixel像素, 或许您会认为这个宽度就是ListBox的宽度, 但是结果却不是这样的,它真正指的是这个卷动轴要卷动的文字的宽度, 所以您要预留可能放到ListBox内的资料最长的长度,假设留得太短,可能出现以下二种情形:1、水平卷动轴的宽度设的比ListBox本身的宽度还短,VB会认为不需要卷动轴,而不产生卷动轴!2、 水平卷动轴的宽度设的比ListBox内的资料宽度还短,那么只能卷动一半,还是看不到完整内容!47、ListBox选项资料太长,如何使用ToolTip来显示内容?ListBox选

48、项资料太长,虽然可以加上水平卷动轴,但卷来卷去还是有点麻烦,如果可以出现Popup ToolTip就更正点了!当然,您假设想要二种功能一起使用,也是可以的。关于这个主题,我看过很多范例都是使用API来做,但是以下这个方法既简单,又不必使用任何API,帅吧!Private Sub List1_MouseMove(Button As Integer, Shift As Integer, _X As Single, Y As Single)Dim Ypos As Integer, iOldFontSize As IntegeriOldFontSize = Me.Font.SizeMe.Font.Si

49、ze = List1.Font.SizeYpos = Y Me.TextHeight(Xyz) + List1.TopIndexMe.Font.Size = iOldFontSizeIf Ypos List1.ListCount ThenList1.ToolTipText = List1.List(Ypos)ElseList1.ToolTipText = End IfEnd Sub48、如何加长ComboBox的下拉选单?Combo预设的下拉长度只有5,6个选项,中选项很多时,要卷老半天才能找到资料,很不方便!要加长ComboBox的下拉选单,方法如下:在声明区中放入以下声明及Subrouti

50、nePrivate Declare Function MoveWindow Lib user32 _(ByVal hwnd As Long, ByVal x As Long, ByVal y As _Long, ByVal nWidth As Long, ByVal nHeight As Long, _ByVal bRepaint As Long) As LongPublic Sub SetComboHeight(oComboBox As ComboBox, lNewHeight As Long)Dim oldscalemode As Integer This procedure does n

51、ot work with frames: you cannot set the ScaleMode to vbPixels, because the frame does not have a ScaleMode Property. To get round this, you could set the parent control to be the form while you run this procedure.If TypeOf oComboBox.Parent Is Frame Then Exit Sub Change the ScaleMode on the parent to

52、 Pixels.Oldscalemode = oComboBox.Parent.ScaleModeoComboBox.Parent.ScaleMode = vbPixels Resize the combo box window.MoveWindow oComboBox.hwnd, oComboBox.Left, _oComboBox.Top, oComboBox.Width, lNewHeight, 1 Replace the old ScaleModeoComboBox.Parent.ScaleMode = oldscalemodeEnd Sub在任何时候(不一定是Form_Load或Co

53、mbo_DropDown), 想要加长ComboBox的下拉选单时, 只要参加以下程序即可:Call SetComboHeight(Combo1, 270) 设定的单位是Pixels49、如何加宽ComboBox的下拉选单?和ListBox一样,ComboBox也会有宽度不够的情形,Combo下拉之后资料看不完整,当Form上的物件不多时,还可以拉长一点,但有时候也没方法!这时候,还是得靠API了!在声明区中放入以下声明及SubroutinePrivate Declare Function SendMessage Lib user32 _Alias SendMessageA (ByVal hw

54、nd As Long, _ByVal wMsg As Long, ByVal wParam As Long, _lParam As Long) As LongConst CB_SETDROPPEDWIDTH = &H160Public Sub SetComboWidth(oComboBox As ComboBox, lWidth As Long) lWidth是宽度,单位是pixelsSendMessage oComboBox.hwnd, CB_SETDROPPEDWIDTH, lWidth, 0End Sub在任何时候(不一定是Form_Load或Combo_DropDown), 想

55、要加宽ComboBox的下拉选单时,只要参加以下程序即可(假设设定的宽度小于Combo原来的宽度那么无效):Call SetComboWidth(Combo1, 270) 设定的单位是Pixels50、如何用程序控制滑鼠游标(Mouse Cursor)到指定位置?以下这个例子,当User在Textl中按下Enter键后,滑鼠游标会自动移到Command2按钮上方请在声明区中参加以下声明:16位版本:( Sub无传回值)Declare Sub SetCursorPos Lib User _(ByVal X As Integer, ByVal Y As Integer)32位版本:( Functi

56、on有传回值,Integer改成Long )Declare Function SetCursorPos Lib user32 _(ByVal x As Long, ByVal y As Long) As Long在Form1中参加以下程序码:Private Sub Text1_KeyPress(KeyAscii As Integer)If KeyAscii = 13 Thenx% = (Form1.Left + Command2.Left + Command2.Width _/ 2 + 60) / Screen.TwipsPerPixelXy% = (Form1.Top + Command2.

57、Top + Command2.Height _/ 2 + 360) / Screen.TwipsPerPixelYSetCursorPos x%, y%End IfEnd Sub51 、如何用鼠标移动没有标题的 Form ,或移动 Form 中的控制项?52、如何判断目前电脑中所有磁盘之型态?53、检查文件是否存在?54、如何用Image 来做成带有图片的按钮,按下鼠标时如同按钮般会变换图片?55、听说 VB 6.0 的 CommandButton 己经可放图片,要如何使用?51、如何用鼠标移动没有标题的Form ,或移动 Form 中的控制项?在声明区中放入以下声明:16 位版本: ( Su

58、b 无返回值)Private Declare Sub ReleaseCapture Lib User ()Private Declare Sub SendMessage Lib User _(ByVal hwnd As Integer, ByVal wMsg As Integer, _ByVal wParam As Integer, lParam As Long)32 位版本: ( Function 有返回值,Integer 改成 Long )Private Declare Function ReleaseCapture _Lib user32 () As LongPrivate Declar

59、e Function SendMessage Lib user32 _Alias SendMessageA (ByVal hwnd As Long, _ByVal wMsg As Long, ByVal wParam As Long, _ lParam As Any) As Long 共用常数:Const WM_SYSCOMMAND = &H112Const SC_MOVE = &HF012 假设要移动 Form ,程序码如下:Private Sub Form_MouseDown(Button As Integer, _Shift As Integer, X As Single

60、, Y As Single)Dim I As LongI = ReleaseCaptureI = SendMessage(Form1.hwnd, _WM_SYSCOMMAND, SC_MOVE, 0)End Sub 以上功能也适用于用鼠标在 Form 中移动控制项,程序码如下:Private Sub Command1_MouseDown(Button As Integer, _Shift As Integer, X As Single, Y As Single)Dim I As LongI = ReleaseCaptureI = SendMessage(Command1.hwnd, _WM_SYSCOMMAND, SC_MOVE, 0)End Sub52、如何判断目前电脑中所有磁盘之型态?在 Form 中放置一个ListBox 名称为 List1Private Declare Function GetDriveType Lib kernel32 _Alias GetDriveTypeA (ByVal nDrive As String) As LongPrivate Sub Form_Load()Dim I As IntegerDim ret As Long 返回值Dim w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论