vb6中如何改变listView控件里面item的颜色?

解决方案 »

  1.   

    是前景色还是背景色?
    前景色的话,listview提供了接口
    背景色的话,简单一点的方法是用图片模拟,复杂一点的方法是自绘listView
      

  2.   

    前景色,我的要求是每个item中的文字可以定义为不同的颜色
      

  3.   

    比如 Set itmx = ListView1.ListItems.Add(, , 1)
     itmx.SubItems(1) = "红色"我希望“红色”这两个字的颜色显示为红色,listView有接口么?
      

  4.   

    'In Form1:
    Option Explicit
    Private Const GWL_WNDPROC As Long = (-4&)
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Sub Form_Load()
      With ListView1
        .FullRowSelect = True
        .View = lvwReport
        .ColumnHeaders.Add , , "Item Column"
        .ColumnHeaders.Add , , "Subitem 1"
        .ColumnHeaders.Add , , "Subitem 2"
        Dim i&
        For i = 1 To 30
          With .ListItems.Add(, , CStr(Int(200 * Rnd)))
            .SubItems(1) = "Subitem 1"
            .SubItems(2) = "Subitem 2"
            .Tag = CStr(QBColor(i Mod 15))
          End With
        Next
        g_MaxItems = .ListItems.Count - 1
      End With
      g_addProcOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
      Call SetWindowLong(hWnd, GWL_WNDPROC, g_addProcOld)
    End Sub
    'In Module1
    Option ExplicitPublic Const NM_CUSTOMDRAW = (-12&)
    Public Const WM_NOTIFY As Long = &H4E&Public Const CDDS_PREPAINT As Long = &H1&
    Public Const CDRF_NOTIFYITEMDRAW As Long = &H20&
    Public Const CDDS_ITEM As Long = &H10000
    Public Const CDDS_ITEMPREPAINT As Long = CDDS_ITEM Or CDDS_PREPAINT
    Public Const CDRF_NEWFONT As Long = &H2&Public Type NMHDR
        hWndFrom As Long   ' Window handle of control sending message
        idFrom As Long        ' Identifier of control sending message
        code  As Long          ' Specifies the notification code
    End Type' sub struct of the NMCUSTOMDRAW struct
    Public Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
    End Type' generic customdraw struct
    Public Type NMCUSTOMDRAW
        hdr As NMHDR
        dwDrawStage As Long
        hDC As Long
        rc As RECT
        dwItemSpec As Long
        uItemState As Long
        lItemlParam As Long
    End Type' listview specific customdraw struct
    Public Type NMLVCUSTOMDRAW
        nmcd As NMCUSTOMDRAW
        clrText As Long
        clrTextBk As Long
        ' if IE >= 4.0 this member of the struct can be used
        'iSubItem As Integer
    End TypePublic g_addProcOld As Long
    Public g_MaxItems As Long
      
    Public 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
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)  
    Public Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      Select Case iMsg
        Case WM_NOTIFY
          Dim udtNMHDR As NMHDR
          CopyMemory udtNMHDR, ByVal lParam, 12&
          With udtNMHDR
            If .code = NM_CUSTOMDRAW Then
              Dim udtNMLVCUSTOMDRAW As NMLVCUSTOMDRAW
              CopyMemory udtNMLVCUSTOMDRAW, ByVal lParam, Len(udtNMLVCUSTOMDRAW)
              With udtNMLVCUSTOMDRAW.nmcd
                Select Case .dwDrawStage
                  Case CDDS_PREPAINT
                    WindowProc = CDRF_NOTIFYITEMDRAW
                    Exit Function
                  Case CDDS_ITEMPREPAINT
                      udtNMLVCUSTOMDRAW.clrText = Val(Form1.ListView1.ListItems(.dwItemSpec + 1).Tag)
                      CopyMemory ByVal lParam, udtNMLVCUSTOMDRAW, Len(udtNMLVCUSTOMDRAW)
                      WindowProc = CDRF_NEWFONT
                      Exit Function
                End Select
              End With
            End If
          End With
      End Select
      WindowProc = CallWindowProc(g_addProcOld, hWnd, iMsg, wParam, lParam)
    End Function
      

  5.   

    leolan,能不能解释一下你的例子呢?说得详细一点吧
      

  6.   

    Private Sub Form_Load()
        Dim itemx As ListItem
        For i = 1 To 100
              Set itemx = ListView1.ListItems.Add(, , Int(Rnd * 10000))
              itemx.ForeColor = vbRed
        Next
    End Sub
      

  7.   

    在添加item時系統會向窗口發送wm_notify消息,上面的例子是通過攔截此消息並修改lparam的值來改變item的前景顏色.