1. 在DropDown时列表显示数据
如果选择一项则触发Click事件
如果没选择触发什么呀,怎么判断没有选择呢??2.实际我要实现的功能如下
我的界面放的combobox控件宽度不能太大,我想在DropDown时宽度加大,click后宽度还原。但是如果没有选择即没有Click时,没有事件发生,我怎么才能还原呢
如果选择一项则触发Click事件
如果没选择触发什么呀,怎么判断没有选择呢??2.实际我要实现的功能如下
我的界面放的combobox控件宽度不能太大,我想在DropDown时宽度加大,click后宽度还原。但是如果没有选择即没有Click时,没有事件发生,我怎么才能还原呢
Combo1.Width = OldWidth
End SubPrivate Sub Combo1_DropDown()
Combo1.Width = OldWidth + 200
End SubPrivate Sub Combo1_LostFocus()
Call Combo1_Click
End SubPrivate Sub Form_Load()
OldWidth = Combo1.Width
End Sub^_^
Mouse 钩子是什么??谢谢
Public Const CBN_CLOSEUP = 8
Public Const WM_COMMAND = &H111Declare 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 LongPublic prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_COMMAND And wParam \ 65536 = CBN_CLOSEUP Then
If lParam = Form1.Combo1.hWnd Then
Form1.List1.AddItem "Combo1被收起来了"
ElseIf lParam = Form1.Combo2.hWnd Then
Form1.List1.AddItem "Combo2被收起来了"
End If
End If
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End FunctionForm代码定义:
Private Sub Combo1_DropDown()
List1.AddItem "Combo1被拉下来了"
End SubPrivate Sub Combo2_DropDown()
List1.AddItem "Combo2被拉下来了"
End SubPrivate Sub Form_Load()
prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
End SubPrivate Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
End Sub
当ComboBox收起来的时候会向父窗口发送CBN_CLOSEUP通知消息
但VB没有映射成事件2.
发送CB_SETDROPPEDWIDTH改变下拉部分的宽度call sendmessage(combo1.hwnd,CB_SETDROPPEDWIDTH, 像素宽度, byval 0&)CB_SETDROPPEDWIDTH
An application sends the CB_SETDROPPEDWIDTH message to set the maximum allowable width, in pixels, of the list box of a combo box with the CBS_DROPDOWN or CBS_DROPDOWNLIST style. CB_SETDROPPEDWIDTH
wParam = (WPARAM) wWidth, // width of list box, in pixels
lParam = 0, // not used, must be zero
Parameters
wWidth
Specifies the width of the list box, in pixels.
Return Values
If the message is successful, The return value is the new width of the list box. If the message fails, the return value is CB_ERR.Res
By default, the minimum allowable width of the drop-zdown list box is 0. The width of the list box is either the minimum allowable width or the combo box width, whichever is larger.QuickInfo
Windows NT: Requires version 4.0 or later.
Windows: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
Header: Declared in winuser.h.
放到容器控件怎么改?没怎么用过API,看来要好好补习一下
一个窗体,一个模块:
模块代码:
Option Explicit
Public Const GWL_WNDPROC = (-4)
Public Const WM_COMMAND = &H111
Public Const CBN_SELENDCANCEL = 10
Public Const CBN_SELENDOK = 9
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 LongPublic prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_COMMAND And wParam \ 65536 = CBN_SELENDCANCEL Then
If lParam = Form1.Combo1.hWnd Then
Debug.Print "没有选择任何条目,Combo1的下拉列表就被收起来了"
ElseIf lParam = Form1.Combo2.hWnd Then
Debug.Print "没有选择任何条目,Combo2的下拉列表就被收起来了"
End If
ElseIf Msg = WM_COMMAND And wParam \ 65536 = CBN_SELENDOK Then
If lParam = Form1.Combo1.hWnd Then
Debug.Print "选择了某个条目,导致Combo1的下拉列表被收起来"
ElseIf lParam = Form1.Combo2.hWnd Then
Debug.Print "选择了某个条目,导致Combo2的下拉列表被收起来"
End If
End If
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Function窗体上有两个combobox控件:
Option ExplicitPrivate Sub Form_Load()
Dim i As Long
For i = 1 To 20
Me.Combo1.AddItem ("line " + CStr(i))
Me.Combo2.AddItem ("test " + CStr(i))
Next
prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
End SubPrivate Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
End Sub
这样:
call sendmessage(combo1.hwnd,CB_SETDROPPEDWIDTH, 像素宽度, byval 0&)
声明你自己添加
哪里有这些API的详细学习资料,我要好好学习
call sendmessage(combo1.hwnd,CB_SETDROPPEDWIDTH, 像素宽度, byval 0&)
CB_SETDROPPEDWIDTH 给它赋什么值,是改变后的宽度吗?像素宽度指的是什么?我怎么试了一下没反应?
CB_SETDROPPEDWIDTH = &H160还是给你个例子吧:Private Declare Function SendMessage Lib _
"USER32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As _
Long) As Long
Private Const CB_GETDROPPEDWIDTH = &H15F
Private Const CB_SETDROPPEDWIDTH = &H160
Private Const CB_ERR = -1
函数:
' 取得 Combo 下拉的宽度
' 可以利用该函数比例放大或缩小宽度
Public Function GetDropdownWidth(cboHwnd As Long) As Long
Dim lRetVal As Long
lRetVal = SendMessage(cboHwnd, CB_GETDROPPEDWIDTH, 0, 0)
If lRetVal <> CB_ERR Then
GetDropdownWidth = lRetVal
'单位为 pixels
Else
GetDropdownWidth = 0
End If
End Function
'设置 Combo 下拉的宽度
'单位为 pixels
Public Function SetDropdownWidth(cboHwnd As _
Long, NewWidthPixel As Long) As Boolean
Dim lRetVal As Long
lRetVal = SendMessage(cboHwnd, _
CB_SETDROPPEDWIDTH, NewWidthPixel, 0)
If lRetVal <> CB_ERR Then
SetDropdownWidth = True
Else
SetDropdownWidth = False
End If
End FunctionPrivate Sub Form_Load()
Dim i As Long
For i = 1 To 20
Combo1.AddItem "line " + CStr(i)
Next
Dim mwidth As Long
mwidth = GetDropdownWidth(Combo1.hwnd)
SetDropdownWidth Combo1.hwnd, mwidth + 100
End Sub
像CB_SETDROPPEDWIDTH这些常数不知道哪里能有说明?
像CB_SETDROPPEDWIDTH这些常数不知道哪里能有说明?
--------------------------------1.狂买书
2.狂上编程论坛
3.狂下载代码,分析代码的实现原理
4.有事没事翻MSDN
MSDN关于ComboBox的资料:Visual Studio 6.0(包含VB6)的MSDN:
平台SDK
User Interface Services
Controls
Combo Boxs-- zyl910公告(2004/8/28) ---------昨天突然打雷下雨
导致计算机突然断电
我那时正在上网今天雨才停
拨号一看
“没有拨号音”我在家里翻箱倒柜
总算找到一个Modem了
可惜是14.4kbps的
上网速度很不爽所以这几天可能不会上网了
(再过几天就开学了)