Option Explicit
Public objFind As LV_FINDINFO
Public objItem As LV_ITEM
Public sOrder As Boolean
Public Type POINTAPI
x As Long
y As Long
End Type
Public Type LV_FINDINFO
flags As Long
psz As String
lParam As Long
pt As POINTAPI
vkDirection As Long
End Type
Public Type LV_ITEM
mask As Long
iItem As Long
iSubItem As Long
State As Long
stateMask As Long
pszText As String
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
End Type
Public Const LVFI_PARAM As Long = &H1
Public Const LVIF_TEXT As Long = &H1
Public Const LVM_FIRST As Long = &H1000
Public Const LVM_FINDITEM As Long = (LVM_FIRST + 13)
Public Const LVM_GETITEMTEXT As Long = (LVM_FIRST + 45)
Public Const LVM_SORTITEMS As Long = (LVM_FIRST + 48)
Public m_Col As Integer
'API declarations
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 Function CompareDates(ByVal lParam1 As Long, _
ByVal lParam2 As Long, _
ByVal hwnd As Long) As Long
r = SendMessage(hwnd, LVM_GETITEMTEXT, hIndex, objItem)
If r > 0 Then
ListView_GetItemValueStr = CDbl(Left$(objItem.pszText, r))
End If
End Function
Public Function FARPROC(pfn As Long) As Long
FARPROC = pfn
End Function
'//////////////
'//调用
Private Sub lstvAll_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
With lstvAll
m_Col = ColumnHeader.Index - 1
Select Case ColumnHeader.Index - 1
Case Is = 2, 5
'Use sort routine to sort by date
sOrder = Not sOrder
.Sorted = False
SendMessage .hwnd, _
LVM_SORTITEMS, _
.hwnd, _
ByVal FARPROC(AddressOf CompareDates)
Case Is = 3, 6, 7
'Use sort routine to sort by value
sOrder = Not sOrder
.Sorted = False
SendMessage .hwnd, _
LVM_SORTITEMS, _
.hwnd, _
ByVal FARPROC(AddressOf CompareValues)
Case Else
'Use default sorting to sort the items in the list
.SortOrder = 1 - .SortOrder
.Sorted = True
.SortKey = ColumnHeader.Index - 1