以下代码调试通过:'模块中:Option Explicit Public Const CB_GETLBTEXTLEN = &H149 Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const SM_CYVSCROLL = 20 Public Const CB_SETDROPPEDWIDTH = &H160 Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Public Sub SetComboWidth(cboIn As ComboBox)
Dim nCount As Long Dim nNumChars As Long Dim nLongestComboItem As Long Dim nNewDropDownWidth As Long Dim nOldScaleMode As Integer Dim nLongestComboItemIndex As Integer Dim oOldFont As Font
For nCount = 0 To cboIn.ListCount - 1 nNumChars = SendMessage(cboIn.hwnd, CB_GETLBTEXTLEN, nCount, CLng(0)) If nNumChars > nLongestComboItem Then nLongestComboItem = nNumChars nLongestComboItemIndex = nCount End If Next
nOldScaleMode = cboIn.Parent.ScaleMode Set oOldFont = cboIn.Parent.Font
cboIn.Parent.ScaleMode = vbPixels Set cboIn.Parent.Font = cboIn.Font
nNewDropDownWidth = cboIn.Parent.TextWidth(cboIn.List(nLongestComboItemIndex)) cboIn.Parent.ScaleMode = nOldScaleMode Set cboIn.Parent.Font = oOldFont
If cboIn.ListCount > 8 Then nNewDropDownWidth = nNewDropDownWidth + GetSystemMetrics(SM_CYVSCROLL) + 7 Else nNewDropDownWidth = nNewDropDownWidth + 7 End If SendMessage cboIn.hwnd, CB_SETDROPPEDWIDTH, nNewDropDownWidth, CLng(0) End Sub'窗体中: Private Sub Combo1_DropDown() Call SetComboWidth(Combo1) End SubPrivate Sub Form_Load() Combo1.AddItem "aisrujwkjwirjlkasitu" Combo1.AddItem "qw84isdut8iewi" Combo1.AddItem "e8w439ioeit9weie5po4i39" End Sub
另外搞个类似tooltip的label来显示全文吧
我有很多的这样的控件,如果每个都这样出tooltip那么不就太麻烦了??
一般来说tooltip的label只有一个,根据你的鼠标指向的控件决定label显示的内容以及位置
楼主试了我的代码吗? Private Sub Combo1_DropDown() Call SetComboWidth(Combo1) End Sub 当下拉Combo1时,会自动调整下拉框的宽度以适应文本
楼主试了我的代码吗? Private Sub Combo1_DropDown() Call SetComboWidth(Combo1) End Sub 当下拉Combo1时,会自动调整下拉框的宽度以适应文本 /////////////////////////////////////////////////////////////////// 我的软件已经基本完成了,但是有很多的界面,并且每个界面都有十几个COMBOBOX控件,每个去响应这样的消息的话代码量太大了,并且容易出错误.我想试试lsftest() 的方法
1.在标准模块中声明 Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const CB_SETDROPPEDWIDTH = &H1602.在窗体中自定义函数 Private Function SetCboWidth(ByVal cbo As ComboBox, ByVal lngWidth As Long) As Boolean On Error Resume Next
' cbo为要加宽的ComboBox,lngWidth为宽度 SendMessage cbo.hwnd, CB_SETDROPPEDWIDTH, lngWidth, 0End Function3.当某cbo需要加宽时,例: Private Sub cboEdit_DropDown() SetCboWidth cboEdit, 180End Sub
我想试试lsftest() 的方法 ==================一个简单的例子:'模块: Option ExplicitPublic Const GWL_WNDPROC = (-4)Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Const WM_CTLCOLORLISTBOX = &H134 Public prevWndProc As Long Dim t As BooleanFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam) If Msg = WM_CTLCOLORLISTBOX Then If t Then t = Not t Else Debug.Print Form1.Combo1.List(Form1.Combo1.ListIndex) t = Not t End If End If End Function '程序: Option ExplicitPrivate Sub Form_Load() prevWndProc = GetWindowLong(Combo1.hWnd, GWL_WNDPROC) SetWindowLong Combo1.hWnd, GWL_WNDPROC, AddressOf WndProc End SubPrivate Sub Form_Unload(Cancel As Integer) SetWindowLong Combo1.hWnd, GWL_WNDPROC, prevWndProc End Sub
Public Const CB_GETLBTEXTLEN = &H149
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const SM_CYVSCROLL = 20
Public Const CB_SETDROPPEDWIDTH = &H160
Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Public Sub SetComboWidth(cboIn As ComboBox)
Dim nCount As Long
Dim nNumChars As Long
Dim nLongestComboItem As Long
Dim nNewDropDownWidth As Long
Dim nOldScaleMode As Integer
Dim nLongestComboItemIndex As Integer
Dim oOldFont As Font
For nCount = 0 To cboIn.ListCount - 1
nNumChars = SendMessage(cboIn.hwnd, CB_GETLBTEXTLEN, nCount, CLng(0))
If nNumChars > nLongestComboItem Then
nLongestComboItem = nNumChars
nLongestComboItemIndex = nCount
End If
Next
nOldScaleMode = cboIn.Parent.ScaleMode
Set oOldFont = cboIn.Parent.Font
cboIn.Parent.ScaleMode = vbPixels
Set cboIn.Parent.Font = cboIn.Font
nNewDropDownWidth = cboIn.Parent.TextWidth(cboIn.List(nLongestComboItemIndex))
cboIn.Parent.ScaleMode = nOldScaleMode
Set cboIn.Parent.Font = oOldFont
If cboIn.ListCount > 8 Then
nNewDropDownWidth = nNewDropDownWidth + GetSystemMetrics(SM_CYVSCROLL) + 7
Else
nNewDropDownWidth = nNewDropDownWidth + 7
End If
SendMessage cboIn.hwnd, CB_SETDROPPEDWIDTH, nNewDropDownWidth, CLng(0)
End Sub'窗体中:
Private Sub Combo1_DropDown()
Call SetComboWidth(Combo1)
End SubPrivate Sub Form_Load()
Combo1.AddItem "aisrujwkjwirjlkasitu"
Combo1.AddItem "qw84isdut8iewi"
Combo1.AddItem "e8w439ioeit9weie5po4i39"
End Sub
Private Sub Combo1_DropDown()
Call SetComboWidth(Combo1)
End Sub
当下拉Combo1时,会自动调整下拉框的宽度以适应文本
Private Sub Combo1_DropDown()
Call SetComboWidth(Combo1)
End Sub
当下拉Combo1时,会自动调整下拉框的宽度以适应文本
///////////////////////////////////////////////////////////////////
我的软件已经基本完成了,但是有很多的界面,并且每个界面都有十几个COMBOBOX控件,每个去响应这样的消息的话代码量太大了,并且容易出错误.我想试试lsftest() 的方法
因为combobox没有鼠标事件,所以只有用api来搞,反正我是不会-_-!
1.在标准模块中声明
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const CB_SETDROPPEDWIDTH = &H1602.在窗体中自定义函数
Private Function SetCboWidth(ByVal cbo As ComboBox, ByVal lngWidth As Long) As Boolean
On Error Resume Next
' cbo为要加宽的ComboBox,lngWidth为宽度
SendMessage cbo.hwnd, CB_SETDROPPEDWIDTH, lngWidth, 0End Function3.当某cbo需要加宽时,例:
Private Sub cboEdit_DropDown() SetCboWidth cboEdit, 180End Sub
==================一个简单的例子:'模块:
Option ExplicitPublic Const GWL_WNDPROC = (-4)Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const WM_CTLCOLORLISTBOX = &H134
Public prevWndProc As Long
Dim t As BooleanFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
If Msg = WM_CTLCOLORLISTBOX Then
If t Then
t = Not t
Else
Debug.Print Form1.Combo1.List(Form1.Combo1.ListIndex)
t = Not t
End If
End If
End Function
'程序:
Option ExplicitPrivate Sub Form_Load()
prevWndProc = GetWindowLong(Combo1.hWnd, GWL_WNDPROC)
SetWindowLong Combo1.hWnd, GWL_WNDPROC, AddressOf WndProc
End SubPrivate Sub Form_Unload(Cancel As Integer)
SetWindowLong Combo1.hWnd, GWL_WNDPROC, prevWndProc
End Sub
”的可行性。。但实际上如果“我的软件已经基本完成了,但是有很多的界面,并且每个界面都有十几个COMBOBOX控件,每个去响应这样的消息的话代码量太大了,并且容易出错误.
”,则此法不太合适。
不过不是谢谢大家的讨论特别是happy_sea(开心海) 和lsffest,
我想让帖子再多放几天再给你俩结账