64、如何让 ListBox 同一列显示二栏以上的栏位?
要让 ListBox 显示二栏以上,有很多方法:
有人用二个字串中间加上空白来 AddItem,但是这样有一个很大的缺点,就是第二栏常常无法对齐!有人说可以加上 Format
来强迫留白,以便对齐,但是这些方法都比较麻烦,没有效率!
有一个很简单,又保证不用伤脑筋就可以对 的方法,就是使用 vbTab!作法如下:
lstMyListBox.AddItem "0001" & vbTab & "王一" & vbTab & "广州市"
lstMyListBox.AddItem "0002" & vbTab & "丁二" & vbTab & "上海市"
lstMyListBox.AddItem "0003" & vbTab & "张三" & vbTab & "北京市"
lstMyListBox.AddItem "0004" & vbTab & "李四" & vbTab & "重庆市"
65、如何控制二栏以上 ListBox 之各栏位宽度?
使用 vbTab 来设定 ListBox 的多栏显示,效果不错,但是若以 vbTab 来做,每栏长度是固定的,只有 8,我的资料有些字串很长,有些很短,如果可以逐栏设定宽度,那就太完美了!但是单用 VB 的基本函数,是做不到的!不过我们可以 Call API:
假设要放到 ListBox 的资料有四个栏位,如下:
1、员工编号 (长度为6)
2、员工姓名 (长度为6)
3、员工住址 (长度为38)
4、员工性别 [长为4]
Const LB_SETTABSTOPS = &H192
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Sub SetListTabStops(iListHandle As Long)
‘ 设定四个栏位, 长度各为 6,6,38,4
‘ iListHandle = the window handle of the list box
Dim iNumColumns As Long
Dim iListTabs(3) As Long
Dim Ret As Long
iNumColumns = 4
iListTabs(0) = 24 ‘ 24/4 = 6 (第1-第6字节)
iListTabs(1) = 48 ‘ 48/4 = 12 (第7-第12字节)
iListTabs(2) = 200 ‘ 200/4 = 50 (第13-第50字节)
iListTabs(3) = 216 ‘ 216/4 = 54 (第51-第54字节)
Ret = SendMessage(iListHandle, LB_SETTABSTOPS, _
iNumColumns, iListTabs(0))
End Sub
Private Sub Form_Load()
Call SetListTabStops(List1.hwnd)
List1.AddItem "0001" & vbTab & "王一" & vbTab & "广州市市体育东路二段120巷176号" & vbTab & "男"
List1.AddItem "0002" & vbTab & "丁二" & vbTab & "北京市中关村路100号" & vbTab & "男"
List1.AddItem "0003" & vbTab & "张三" & vbTab & "上海市中山路150巷26号" & vbTab & "女"
List1.AddItem "0004" & vbTab & "李四" & vbTab & "重庆市福州路99号" & vbTab & "男"
66、ListBox 选项资料太长,如何设定 ListBox 的水平卷动轴?
VB 的 ListBox 并没有水平卷动轴的功能,如果遇到某一个资料项很长时, 使用者就无法看到这一个资料项的所有内容,要如何设定水平卷动轴给 ListBox?
可利用 SendMessage 传送 LB_SETHORIZONTALEXTENT 讯息给 ListBox,此一讯息的作用就是要求ListBox 设定水平卷动轴, 细节如下:
1. API 的声明:
‘16位
Const WM_USER = &H400
Const 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 Any) As Long
‘32位
Const LB_SETHORIZONTALEXTENT = &H194
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
2. 程序范例:
‘ List1 为 ListBox 的名称
Call SendMessage(List1.hwnd, LB_SETHORIZONTALEXTENT, 水平卷动轴的宽度, ByVal 0&)
特别注意:
以上的水平卷动轴宽度的单位是 pixel(像素),或许您会认为这个宽度就是 ListBox 的宽度,但是结果却不是这样的,它真正指的是这个卷动轴要卷动的文字的宽度,所以您要预留可能放到 ListBox 内的资料最长的长度,若留得太短,可能出现以下二种情形:
1、 水平卷动轴的宽度设的比 ListBox 本身的宽度还短,VB会认为不需要卷动轴,而不产生卷动轴!
2、 水平卷动轴的宽度设的比 ListBox 内的资料宽度还短,则只能卷动一半,还是看不到完整内容!
67、ListBox 选项资料太长,如何使用 ToolTip 来显示内容?
ListBox 选项资料太长,虽然可以加上水平卷动轴,但卷来卷去还是有点麻烦,如果可以出现 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 Integer
iOldFontSize = Me.Font.Size
Me.Font.Size = List1.Font.Size
YPos = Y \ Me.TextHeight("Xyz") + List1.TopIndex
Me.Font.Size = iOldFontSize
If YPos < List1.ListCount Then
List1.ToolTipText = List1.List(YPos)
Else
List1.ToolTipText = ""
End If
End Sub
68、如何加长 ComboBox 的下拉选单?
Combo 预设的下拉长度只有 5,6 个选项,当选项很多时,要卷老半天才能找到资料,很不方便!要加长 ComboBox 的下拉选单,方法如下:
在声明区中放入以下声明及 Subroutine
Private 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 Long
Public Sub SetComboHeight(oComboBox As ComboBox, lNewHeight As Long)
Dim oldscalemode As Integer
‘ This procedure does not 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 Pixels.
oldscalemode = oComboBox.Parent.ScaleMode
oComboBox.Parent.ScaleMode = vbPixels
‘ Resize the combo box window.
MoveWindow oComboBox.hwnd, oComboBox.Left, oComboBox.Top, oComboBox.Width, lNewHeight, 1
‘ Replace the old ScaleMode
oComboBox.Parent.ScaleMode = oldscalemode
End Sub
在任何时候 (不一定是 Form_Load 或 Combo_DropDown),想要加长 ComboBox 的下拉选单时,只要加入以下程序即可:
Call SetComboHeight(Combo1, 270) ‘设定的单位是 Pixels
69、如何加宽 ComboBox 的下拉选单?
和 ListBox 一样, ComboBox 也会有宽度不够的情形, Combo 下拉之后资料看不完整,当 Form 上的物件不多时,还可以拉长一点,但有时候也没办法!这时候,还是得靠 API 了!
在声明区中放入以下声明及 Subroutine
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Const CB_SETDROPPEDWIDTH = &H160
Public Sub SetComboWidth(oComboBox As ComboBox, lWidth As Long)
‘ lWidth 是宽度,单位是 pixels
SendMessage oComboBox.hwnd, CB_SETDROPPEDWIDTH, lWidth, 0
End Sub
在任何时候 (不一定是 Form_Load 或 Combo_DropDown),想要加宽 ComboBox 的下拉选单时,只要加入以下程序即可 (若设定的宽度小于 Combo 原来的宽度则无效):
Call SetComboWidth(Combo1, 270) ‘设定的单位是 Pixels
联系客服