|
|
|
VB问题全功略(14) |
[上一页](14)[下一页] |
66、ListBox
选项资料太长,如何设定 ListBox 的水平卷动轴? 67、ListBox
选项资料太长,如何使用 ToolTip 来显示内容? 68、如何加长 ComboBox
的下拉选单? 69、如何加宽 ComboBox
的下拉选单? 70、如何用程序控制滑鼠游标
(Mouse Cursor) 到指定位置?
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
70、如何用程序控制滑鼠游标 (Mouse Cursor) 到指定位置?
以下这个例子,当 User 在 Text1 中按下 'Enter' 键后,滑鼠游标会自动移到
Command2 按钮上方
请在声明区中加入以下声明:
'16 位版本: ( Sub 无传回值
) Declare Sub SetCursorPos Lib "User" (ByVal X As Integer, ByVal Y As
Integer)
'32 位版本: ( Function 有传回值,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 Then x% = (Form1.Left + Command2.Left +
Command2.Width / 2 + 60) / Screen.TwipsPerPixelX y% = (Form1.Top +
Command2.Top + Command2.Height / 2 + 360) /
Screen.TwipsPerPixelY SetCursorPos x%, y% End If End
Sub |
|