比如 Set itmx = ListView1.ListItems.Add(, , 1) itmx.SubItems(1) = "红色"我希望“红色”这两个字的颜色显示为红色,listView有接口么?
'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
leolan,能不能解释一下你的例子呢?说得详细一点吧
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
前景色的话,listview提供了接口
背景色的话,简单一点的方法是用图片模拟,复杂一点的方法是自绘listView
itmx.SubItems(1) = "红色"我希望“红色”这两个字的颜色显示为红色,listView有接口么?
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
Dim itemx As ListItem
For i = 1 To 100
Set itemx = ListView1.ListItems.Add(, , Int(Rnd * 10000))
itemx.ForeColor = vbRed
Next
End Sub