VB中无控件使用ListView的类

翻译|其它|编辑:郝浩|2007-03-01 09:41:05.000|阅读 3261 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

Option Explicit

'=-=-=-=增加API声明,by kmlxk=-=-=-=
Private Type InitCommonControlsEx
    dwSize As Long 'size of this structure
    dwICC As Long 'flags indicating which classes to be initialized
End Type
Private Declare Function InitCommonControlsEx Lib "comctl32.dll" (ByRef TLPINITCOMMONCONTROLSEX As InitCommonControlsEx) As Long
Private Const WS_CHILD As Long = &H40000000
Private Const WS_VISIBLE As Long = &H10000000
Private Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function SendLongMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Private Const ICC_LISTVIEW_CLASSES = &H1
Private Const WC_LISTVIEW = "SysListView32"
Private Const WS_EX_CLIENTEDGE = &H200

Private Const LVS_LIST = &H3
Private Const LVS_REPORT = &H1

Private Const LVS_EX_FULLROWSELECT = &H20
Private Const LVS_EX_CHECKBOXES = &H4
Private Const LVS_EX_GRIDLINES = &H1
Private Const LVS_SORTDESCENDING = &H20

Private Const LVM_FIRST = &H1000
Private Const LVM_SETBKCOLOR = (LVM_FIRST + 1)
Private Const LVM_SETTEXTBKCOLOR = (LVM_FIRST + 38)
Private Const LVM_INSERTCOLUMN = (LVM_FIRST + 27)
Private Const LVM_INSERTITEM = (LVM_FIRST + 7)
Private Const LVM_ENSUREVISIBLE = (LVM_FIRST + 19)

Private Const LVM_GETITEMTEXT = (LVM_FIRST + 45)
Private Const LVM_SETITEMTEXT = (LVM_FIRST + 46)        ' 插入列表项子项
Private Const LVM_GETITEM = (LVM_FIRST + 5)
Private Const LVM_SETITEM = (LVM_FIRST + 6)

Private Const LVM_GETNEXTITEM = (LVM_FIRST + 12)
Private Const LVM_SETITEMSTATE = (LVM_FIRST + 43)

Private Const LVM_SETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 54)  ' 设置列表视图的扩展风格
Private Const LVM_GETITEMSTATE = (LVM_FIRST + 44)
Private Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)        ' 取得 ListView 项目记数
Private Const LVM_DELETEITEM = (LVM_FIRST + 8)
'----------------------------------------------------------


' 列表头 of Info
'-----------------------------------------------------------
Private Type LVCOLUMN
    mask As Long
    fmt As Long
    CX As Long
    pszText As String
    cchTextMax As Long
    iSubItem As Long
    iImage As Long
    iOrder As Long
End Type

'-------------------------------------------------------

' LVCOLUMN mask 列表头
Private Const LVCF_FMT = &H1        ' FMT 为有效
Private Const LVCF_WIDTH = &H2      ' 宽度有效
Private Const LVCF_TEXT = &H4       ' 文字有效
Private Const LVCF_SUBITEM = &H8    ' 子项有效
Private Const LVCF_IMAGE = &H10     ' 图片有效


' LVCOLUMN fmt 列表头
Private Const LVCFMT_LEFT = &H0     ' 文字左对齐
Private Const LVCFMT_RIGHT = &H1    ' 文字右对齐
Private Const LVCFMT_CENTER = &H2   ' 文字中对齐
Private Const LVCFMT_JUSTIFYMASK = &H3
Private Const LVCFMT_IMAGE = &H800
Private Const LVCFMT_BITMAP_ON_RIGHT = &H1000
Private Const LVCFMT_COL_HAS_IMAGES = &H8000
'--------------------------------------------------------
' List View Item Info 列表项
'--------------------------------------------------------
Private Type LVITEM
    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

' LVITEM mask
Private Const LVIF_TEXT = &H1               ' 文字有效
Private Const LVIF_IMAGE = &H2              ' 图片有效
Private Const LVIF_PARAM = &H4              ' 排序有效
Private Const LVIF_STATE = &H8              ' 状态(情形)有效
Private Const LVIF_INDENT = &H10            ' 图象缩进有效
Private Const LVIF_NORECOMPUTE = &H800

' LVITEM state
Private Const LVIS_FOCUSED = &H1            '
Private Const LVIS_SELECTED = &H2
Private Const LVIS_CUT = &H4
Private Const LVIS_DROPHILITED = &H8
Private Const LVIS_ACTIVATING = &H20
Private Const LVIS_SELCHECK = &H2000
Private Const LVIS_OVERLAYMASK = &HF00
Private Const LVIS_STATEIMAGEMASK = &HF000
'----------------------------------------------------------
Private N As Long
Private hwndLV As Long

Public Function CreateListView(hWndParent As Long, ID As Long, x&, y&, nWidth&, nHeight&, Optional Style As Long)
    hwndLV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, vbNullString, WS_CHILD Or WS_VISIBLE Or _
    LVS_REPORT Or Style, x, y, nWidth, nHeight, hWndParent, ID, App.hInstance, 0&)
End Function

Public Function ListView_InsertColumn(hwnd As Long, iCol As Long, ColumnText As String, Optional mnWidth As Long = 88) As Boolean
    ' 插入列表头
    Dim pcol As LVCOLUMN
    With pcol
        .mask = LVCF_FMT Or LVCF_TEXT Or LVCF_WIDTH
        .fmt = LVCFMT_LEFT
        .CX = mnWidth
        .pszText = ColumnText
    End With
    Call SendMessage(hwnd, LVM_INSERTCOLUMN, iCol, pcol)
End Function
   
Public Function ListView_SetExtendedListViewStyleEx(Optional dwExStyle As Long)
    ' Visual C++ Macros
    ' 设置扩展风格
    'SendLongMessage
    Call SendLongMessage(hwndLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0&, LVS_EX_FULLROWSELECT Or LVS_EX_GRIDLINES Or dwExStyle)
End Function

Public Function ListView_InsertItem(hwnd As Long, I As Long, ItemText As String, Optional State As Long)
    ' 插入列表项 (但不能插入子项)
    Dim pitem As LVITEM
    With pitem
        .mask = LVIF_TEXT Or LVIF_STATE
        .iItem = I
        .pszText = ItemText
        .State = State
        .stateMask = LVIS_STATEIMAGEMASK
    End With
    Call SendMessage(hwnd, LVM_INSERTITEM, 0, pitem)
    Call SendMessage(hwnd, LVM_SETITEMSTATE, ByVal I, pitem)
End Function
   
Public Function ListView_SetItemText(hwnd As Long, I As Long, iSubItem As Long, pszText As String)
     ' 插入列表项子项(i 为 列表项的 ID (行数) )
 Dim pitem As LVITEM
    With pitem
        .mask = LVIF_TEXT Or LVIF_STATE
        .pszText = pszText
        .iSubItem = iSubItem  ' 列数(在第几列)
    End With
    Call SendMessage(hwnd, LVM_SETITEMTEXT, I, pitem)
End Function
   
Public Function ListView_SetItem(I As Long, strItemText As String)
    Dim pitem As LVITEM
    With pitem
        .mask = LVIF_TEXT Or LVIF_STATE
        .iItem = I
        .pszText = strItemText
    End With
    Call SendMessage(hwndLV, LVM_SETITEM, 0, pitem)
End Function

Public Function ListView_GetItem(I As Long) As String
    Dim lpPitem As LVITEM, ItemText As String
    ItemText = String$(260, 0)
    With lpPitem
        .mask = LVIF_TEXT
        .iItem = I
        .pszText = ItemText
        .cchTextMax = 256
        .iSubItem = 0
    End With
    Call SendMessage(hwndLV, LVM_GETITEM, 0, lpPitem)
    ListView_GetItem = Left$(lpPitem.pszText, InStr(lpPitem.pszText, vbNullChar) - 1)
End Function
   
Public Function ListView_GetItemText(I As Long, iSubItem As Long) As String
    Dim lpPitem As LVITEM
    Dim SubItemText As String
    SubItemText = String$(28, 0)
    lpPitem.iSubItem = iSubItem
    lpPitem.cchTextMax = 28
    lpPitem.pszText = SubItemText
   
    Call SendMessage(hwndLV, LVM_GETITEMTEXT, ByVal I, lpPitem)
    ListView_GetItemText = Left$(lpPitem.pszText, InStr(lpPitem.pszText, vbNullChar) - 1)
End Function

Public Function ListView_SetItemState(sta As Long, Optional staMask As Long)
    Dim pitem As LVITEM
    With pitem
        .mask = LVIF_STATE
        .State = sta
        .stateMask = staMask Or LVIS_STATEIMAGEMASK
    End With
    Call SendMessage(hwndLV, LVM_SETITEMSTATE, -1, pitem)
End Function

 


Public Function ListView_SetBkColor(hwnd As Long, Optional clrBk As Long)
    ' 设置 List View 背景色 (不是列表项目)
    'SendLongMessage
    Call SendLongMessage(hwnd, LVM_SETBKCOLOR, 0, clrBk)
End Function

Public Function ListView_SetTextBkColor(Optional clrText As Long) As Boolean
    ' 设置列表项目的背景色
    'SendLongMessage
    Call SendLongMessage(hwndLV, LVM_SETTEXTBKCOLOR, 0&, clrText)
End Function

Public Function ListView_DeleteItem(iItem As Long) As Boolean
    'SendLongMessage
    ListView_DeleteItem = SendLongMessage(hwndLV, LVM_DELETEITEM, iItem, 0)
End Function
Public Function ListView_GetItemCount() As Long
    'SendLongMessage
    ListView_GetItemCount = SendLongMessage(hwndLV, LVM_GETITEMCOUNT, 0, 0)
End Function
Public Function ListView_GetNextItem() As Long
    'SendLongMessage
    ListView_GetNextItem = SendLongMessage(hwndLV, LVM_GETNEXTITEM, -1, LVIS_SELECTED)
End Function

Public Function ListView_GetItemState(I As Long) As Long
    '(其中LVIS_STATEIMAGEMASK = 0xF000)得到指定项的设置,如果设置为0x2000,
    'SendLongMessage
    ListView_GetItemState = SendLongMessage(hwndLV, LVM_GETITEMSTATE, I, LVIS_STATEIMAGEMASK)
End Function

Public Property Get hwnd() As Long
    hwnd = hwndLV
End Property

Private Sub Class_Initialize()
    Dim icex As InitCommonControlsEx
    icex.dwSize = Len(icex)
    icex.dwICC = ICC_LISTVIEW_CLASSES
  
    Call InitCommonControlsEx(icex)
    hwndLV = 0
End Sub

Private Sub Class_Terminate()
    If hwndLV <> 0 Then
        Call DestroyWindow(hwndLV)
    End If
End Sub


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP