to aohan(景升)OLE设成什么也不行呀,设成关,那就会整个ListView控件一起拖动,我都试了就是不能设成ITEM锁定,可是我看过一个DELPHI写的程序里就有这个效果
可以截获MouseMove消息'模块中的代码. Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 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 LongPublic Const GWL_WNDPROC = (-4) Public Const WM_MOUSEMOVE = &H200Public preWinProc As LongPublic Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg <> WM_MOUSEMOVE Then wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam) End If End Function '窗口代码.Sub Form_Load() LoadlvwIcon Dim ret As Long preWinProc = GetWindowLong(ListView1.hwnd, GWL_WNDPROC) '记录原本的Window Procedure的位址 ret = SetWindowLong(ListView1.hwnd, GWL_WNDPROC, AddressOf wndproc) '将处理的函数地址改为自己的处理函数地址 End SubPrivate Sub Form_Unload(Cancel As Integer) Dim ret As Long ret = SetWindowLong(ListView1.hwnd, GWL_WNDPROC, preWinProc) '取消Message的截取,而使之又只送往原来的Window Procedure End Sub Private Sub LoadlvwIcon() Dim ItemX As ListItemListView1.ColumnHeaders.Clear '清除列标题 ListView1.ListItems.ClearListView1.View = lvwIcon ListView1.FlatScrollBar = False '滚动条Set ItemX = ListView1.ListItems.Add(, , "第一个项目") Set ItemX = ListView1.ListItems.Add(, , "第二个项目") Set ItemX = ListView1.ListItems.Add(, , "第三个项目") Set ItemX = ListView1.ListItems.Add(, , "第四个项目") Set ItemX = ListView1.ListItems.Add(, , "第五个项目") Set ItemX = ListView1.ListItems.Add(, , "第6个项目") End Sub '你参考一下吧.
To: tztz520(午夜逛街)就是这个意思了,原来这么点破事还要用到HOOK,我还以为ListView自己带了这个功能,我没找到呢,早知道就自己写了! 郁闷呀! -_-#不过,还是要散分的,再等一等吧,看看还有没有更好的办法!
'这样呢 Private Sub Form_Load() LoadlvwIcon End SubPrivate Sub ListView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) ListView1.Tag = "1" End SubPrivate Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) If ListView1.Tag = "1" Then ListView1.Enabled = False ListView1.Enabled = True ListView1.Tag = "0" Else If ListView1.Enabled = False Then ListView1.Enabled = True End If End SubPrivate Sub ListView1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) ListView1.Tag = "0" End Sub Private Sub LoadlvwIcon() Dim ItemX As ListItemListView1.ColumnHeaders.Clear '清除列标题 ListView1.ListItems.ClearListView1.View = lvwIcon ListView1.FlatScrollBar = False '滚动条Set ItemX = ListView1.ListItems.Add(, , "第一个项目") Set ItemX = ListView1.ListItems.Add(, , "第二个项目") Set ItemX = ListView1.ListItems.Add(, , "第三个项目") Set ItemX = ListView1.ListItems.Add(, , "第四个项目") Set ItemX = ListView1.ListItems.Add(, , "第五个项目") Set ItemX = ListView1.ListItems.Add(, , "第6个项目") End Sub
http://www.vb-helper.com/howto_listview_popup_menu.html
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
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 LongPublic Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEMOVE = &H200Public preWinProc As LongPublic Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg <> WM_MOUSEMOVE Then
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End If
End Function
'窗口代码.Sub Form_Load()
LoadlvwIcon
Dim ret As Long
preWinProc = GetWindowLong(ListView1.hwnd, GWL_WNDPROC) '记录原本的Window Procedure的位址
ret = SetWindowLong(ListView1.hwnd, GWL_WNDPROC, AddressOf wndproc) '将处理的函数地址改为自己的处理函数地址
End SubPrivate Sub Form_Unload(Cancel As Integer)
Dim ret As Long
ret = SetWindowLong(ListView1.hwnd, GWL_WNDPROC, preWinProc) '取消Message的截取,而使之又只送往原来的Window Procedure
End Sub
Private Sub LoadlvwIcon()
Dim ItemX As ListItemListView1.ColumnHeaders.Clear '清除列标题
ListView1.ListItems.ClearListView1.View = lvwIcon
ListView1.FlatScrollBar = False '滚动条Set ItemX = ListView1.ListItems.Add(, , "第一个项目")
Set ItemX = ListView1.ListItems.Add(, , "第二个项目")
Set ItemX = ListView1.ListItems.Add(, , "第三个项目")
Set ItemX = ListView1.ListItems.Add(, , "第四个项目")
Set ItemX = ListView1.ListItems.Add(, , "第五个项目")
Set ItemX = ListView1.ListItems.Add(, , "第6个项目")
End Sub
'你参考一下吧.
Private Sub Form_Load()
LoadlvwIcon
End SubPrivate Sub ListView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
ListView1.Tag = "1"
End SubPrivate Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If ListView1.Tag = "1" Then
ListView1.Enabled = False
ListView1.Enabled = True
ListView1.Tag = "0"
Else
If ListView1.Enabled = False Then ListView1.Enabled = True
End If
End SubPrivate Sub ListView1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
ListView1.Tag = "0"
End Sub
Private Sub LoadlvwIcon()
Dim ItemX As ListItemListView1.ColumnHeaders.Clear '清除列标题
ListView1.ListItems.ClearListView1.View = lvwIcon
ListView1.FlatScrollBar = False '滚动条Set ItemX = ListView1.ListItems.Add(, , "第一个项目")
Set ItemX = ListView1.ListItems.Add(, , "第二个项目")
Set ItemX = ListView1.ListItems.Add(, , "第三个项目")
Set ItemX = ListView1.ListItems.Add(, , "第四个项目")
Set ItemX = ListView1.ListItems.Add(, , "第五个项目")
Set ItemX = ListView1.ListItems.Add(, , "第6个项目")
End Sub