原来你就相信他?他能做出来早给你了!算了,帮人如同还债,我还是给你一个例子代码:这是用ListView做下拉的例子,你试试!!!'In a module ===== Option Explicit Public defWinProc As LongPublic Const GWL_WNDPROC As Long = -4 Private Const CBN_DROPDOWN As Long = 7 Private Const WM_LBUTTONDOWN As Long = &H201 Private Const WM_KEYDOWN As Long = &H100 Private Const VK_F4 As Long = &H73Private 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 LongPrivate Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" _ (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As LongPublic Declare Function SetWindowLong _ Lib "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Public Sub Unhook(hwnd As Long)If defWinProc <> 0 ThenCall SetWindowLong(hwnd, _ GWL_WNDPROC, _ defWinProc) defWinProc = 0 End IfEnd Sub Public Sub Hook(hwnd As Long)'Don't hook twice or you will 'be unable to unhook it. If defWinProc = 0 ThendefWinProc = SetWindowLong(hwnd, _ GWL_WNDPROC, _ AddressOf WindowProc)End IfEnd Sub Public Function WindowProc(ByVal hwnd As Long, _ ByVal uMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long'only if the window is the combo box... If hwnd = Form1.Combo1.hwnd ThenSelect Case uMsgCase CBN_DROPDOWN 'the list box of a combo 'box is about to be made visible.'return 1 to indicate we ate the message WindowProc = 1Case WM_KEYDOWN 'prevent the F4 key from showing 'the combo's listIf wParam = VK_F4 Then'set up the parameters as though a 'mouse click occurred on the combo, 'and call this routine again Call WindowProc(hwnd, WM_LBUTTONDOWN, 1, 1000)Else'there's nothing to do keyboard-wise 'with the combo, so return 1 to 'indicate we ate the message WindowProc = 1End IfCase WM_LBUTTONDOWN 'process mouse clicks'if the listview is hidden, position and show it If Form1.ListView1.Visible = False ThenWith Form1 .ListView1.Left = .Combo1.Left .ListView1.Width = .Combo1.Width .ListView1.Top = .Combo1.Top + .Combo1.Height + 1 .ListView1.Visible = True .ListView1.SetFocus End WithElse'the listview must be visible, so hide it Form1.ListView1.Visible = False End If'return 1 to indicate we processed the message WindowProc = 1Case Else'call the default window handler WindowProc = CallWindowProc(defWinProc, _ hwnd, _ uMsg, _ wParam, _ lParam)End SelectEnd If 'If hwnd = Form1.Combo1.hwndEnd Function===='In a form, add a combo box, a listview and three command buttons===== Option ExplicitPrivate bKeepOpen As BooleanPrivate Sub Form_Load()Dim c As Long Dim chd As ColumnHeader Dim itmx As ListItem'Add some dummy data to the listview and hide With ListView1Set chd = .ColumnHeaders.Add(, , "Name", 1000) Set chd = .ColumnHeaders.Add(, , "Col 2", 1000) Set chd = .ColumnHeaders.Add(, , "Col 3", 1000) Set chd = .ColumnHeaders.Add(, , "Col 4", 600)For c = 1 To 15 Set itmx = .ListItems.Add(, , Screen.Fonts(c)) itmx.SubItems(1) = "screen" itmx.SubItems(2) = "font" itmx.SubItems(3) = c Next.View = lvwReport .FullRowSelect = True 'vb6 only .BorderStyle = ccNone .Visible = FalseEnd With'set inital state of command buttons Command1.Caption = "hook combo" Command2.Caption = "unhook combo" Command3.Caption = "unhook && end" Command1.Enabled = True Command2.Enabled = False End Sub Private Sub Command1_Click()If defWinProc = 0 Then Hook Combo1.hwnd Command1.Enabled = False Command2.Enabled = True End IfEnd Sub Private Sub Command2_Click()'unhook the combo If defWinProc <> 0 Then Unhook Combo1.hwnd defWinProc = 0 Command1.Enabled = True Command2.Enabled = False End IfEnd Sub Private Sub Command3_Click()Unload MeEnd Sub Private Sub Form_Unload(Cancel As Integer)If defWinProc <> 0 Then Unhook Combo1.hwndEnd Sub Private Sub List1_KeyDown(KeyCode As Integer, Shift As Integer)'set flag to allow arrow and enter 'keys to simulate behaviour of normal 'combo bKeepOpen = TrueEnd Sub Private Sub List1_KeyPress(KeyAscii As Integer)'set flag to allow arrow and enter 'keys to simulate behaviour of normal 'combo If KeyAscii = vbKeyReturn Then'simulate selecting item with enter bKeepOpen = False Call ListView1_Click Else'alpha or arrow keys being used, 'so keep open bKeepOpen = TrueEnd IfEnd Sub Private Sub ListView1_Click()Dim itmx As ListItemIf ListView1.ListItems.Count > 0 ThenSet itmx = ListView1.SelectedItem'For a style 0 combo, you can not assign 'to the Text property from within the click 'event, so the selected item must be 'added' 'as the only combo item, and selected using 'its listindex property. ' 'For a style 2 combo, the text property 'can't be set unless there is an exact 'match to a list item, so again we fake it 'by adding the selection to the combo and 'selecting it. ' 'Finally, since the tabs can't be used 'in the combo's edit window, as it doesn't 'support tabstops either, on selection we'll 'display the main listview item With Combo1 .Clear .AddItem itmx.Text .ListIndex = 0 End WithEnd IfIf bKeepOpen = False Then ListView1.Visible = False Combo1.SetFocus End IfEnd Sub =====
回复人: Bardo(巴顿(永远只有一个)) ( ) 信誉:100 2002-1-20 18:48:43 得分:50
回复人: Bardo(巴顿(永远只有一个)) ( ) 信誉:100 2002-1-20 18:48:43 得分:50
原来你就相信他?他能做出来早给你了!算了,帮人如同还债,我还是给你一个例子代码:这是用ListView做下拉的例子,你试试!!!'In a module
=====
Option Explicit
Public defWinProc As LongPublic Const GWL_WNDPROC As Long = -4
Private Const CBN_DROPDOWN As Long = 7
Private Const WM_LBUTTONDOWN As Long = &H201
Private Const WM_KEYDOWN As Long = &H100
Private Const VK_F4 As Long = &H73Private 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 LongPrivate Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As LongPublic Declare Function SetWindowLong _
Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Sub Unhook(hwnd As Long)If defWinProc <> 0 ThenCall SetWindowLong(hwnd, _
GWL_WNDPROC, _
defWinProc)
defWinProc = 0
End IfEnd Sub
Public Sub Hook(hwnd As Long)'Don't hook twice or you will
'be unable to unhook it.
If defWinProc = 0 ThendefWinProc = SetWindowLong(hwnd, _
GWL_WNDPROC, _
AddressOf WindowProc)End IfEnd Sub
Public Function WindowProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long'only if the window is the combo box...
If hwnd = Form1.Combo1.hwnd ThenSelect Case uMsgCase CBN_DROPDOWN 'the list box of a combo
'box is about to be made visible.'return 1 to indicate we ate the message
WindowProc = 1Case WM_KEYDOWN 'prevent the F4 key from showing
'the combo's listIf wParam = VK_F4 Then'set up the parameters as though a
'mouse click occurred on the combo,
'and call this routine again
Call WindowProc(hwnd, WM_LBUTTONDOWN, 1, 1000)Else'there's nothing to do keyboard-wise
'with the combo, so return 1 to
'indicate we ate the message
WindowProc = 1End IfCase WM_LBUTTONDOWN 'process mouse clicks'if the listview is hidden, position and show it
If Form1.ListView1.Visible = False ThenWith Form1
.ListView1.Left = .Combo1.Left
.ListView1.Width = .Combo1.Width
.ListView1.Top = .Combo1.Top + .Combo1.Height + 1
.ListView1.Visible = True
.ListView1.SetFocus
End WithElse'the listview must be visible, so hide it
Form1.ListView1.Visible = False
End If'return 1 to indicate we processed the message
WindowProc = 1Case Else'call the default window handler
WindowProc = CallWindowProc(defWinProc, _
hwnd, _
uMsg, _
wParam, _
lParam)End SelectEnd If 'If hwnd = Form1.Combo1.hwndEnd Function===='In a form, add a combo box, a listview and three command buttons=====
Option ExplicitPrivate bKeepOpen As BooleanPrivate Sub Form_Load()Dim c As Long
Dim chd As ColumnHeader
Dim itmx As ListItem'Add some dummy data to the listview and hide
With ListView1Set chd = .ColumnHeaders.Add(, , "Name", 1000)
Set chd = .ColumnHeaders.Add(, , "Col 2", 1000)
Set chd = .ColumnHeaders.Add(, , "Col 3", 1000)
Set chd = .ColumnHeaders.Add(, , "Col 4", 600)For c = 1 To 15
Set itmx = .ListItems.Add(, , Screen.Fonts(c))
itmx.SubItems(1) = "screen"
itmx.SubItems(2) = "font"
itmx.SubItems(3) = c
Next.View = lvwReport
.FullRowSelect = True 'vb6 only
.BorderStyle = ccNone
.Visible = FalseEnd With'set inital state of command buttons
Command1.Caption = "hook combo"
Command2.Caption = "unhook combo"
Command3.Caption = "unhook && end"
Command1.Enabled = True
Command2.Enabled = False
End Sub
Private Sub Command1_Click()If defWinProc = 0 Then
Hook Combo1.hwnd
Command1.Enabled = False
Command2.Enabled = True
End IfEnd Sub
Private Sub Command2_Click()'unhook the combo
If defWinProc <> 0 Then
Unhook Combo1.hwnd
defWinProc = 0
Command1.Enabled = True
Command2.Enabled = False
End IfEnd Sub
Private Sub Command3_Click()Unload MeEnd Sub
Private Sub Form_Unload(Cancel As Integer)If defWinProc <> 0 Then Unhook Combo1.hwndEnd Sub
Private Sub List1_KeyDown(KeyCode As Integer, Shift As Integer)'set flag to allow arrow and enter
'keys to simulate behaviour of normal
'combo
bKeepOpen = TrueEnd Sub
Private Sub List1_KeyPress(KeyAscii As Integer)'set flag to allow arrow and enter
'keys to simulate behaviour of normal
'combo
If KeyAscii = vbKeyReturn Then'simulate selecting item with enter
bKeepOpen = False
Call ListView1_Click
Else'alpha or arrow keys being used,
'so keep open
bKeepOpen = TrueEnd IfEnd Sub
Private Sub ListView1_Click()Dim itmx As ListItemIf ListView1.ListItems.Count > 0 ThenSet itmx = ListView1.SelectedItem'For a style 0 combo, you can not assign
'to the Text property from within the click
'event, so the selected item must be 'added'
'as the only combo item, and selected using
'its listindex property.
'
'For a style 2 combo, the text property
'can't be set unless there is an exact
'match to a list item, so again we fake it
'by adding the selection to the combo and
'selecting it.
'
'Finally, since the tabs can't be used
'in the combo's edit window, as it doesn't
'support tabstops either, on selection we'll
'display the main listview item
With Combo1
.Clear
.AddItem itmx.Text
.ListIndex = 0
End WithEnd IfIf bKeepOpen = False Then
ListView1.Visible = False
Combo1.SetFocus
End IfEnd Sub
=====