End Sub Private Sub SetListViewLedger(lv As ListView, _ Bar1Color As LedgerColours, _ Bar2Color As LedgerColours, _ nSizingType As ImageSizingTypes) Dim iBarHeight As Long '/* height of 1 line in the listview Dim lBarWidth As Long '/* width of listview Dim diff As Long '/* used in calculations of row height Dim twipsy As Long '/* variable holding Screen.TwipsPerPicture1elY
iBarHeight = 0 lBarWidth = 0 diff = 0
On Local Error GoTo SetListViewColor_Error
twipsy = Screen.TwipsPerPixelY
If lv.View = lvwReport Then
'/* set up the listview properties With lv .Picture = Nothing '/* clear picture .Refresh .Visible = 1 .PictureAlignment = lvwTile lBarWidth = .Width End With ' lv
'/* set up the picture box properties With Picture1 .AutoRedraw = False '/* clear/reset picture .Picture = Nothing .BackColor = vbWhite .Height = 1 .AutoRedraw = True '/* assure image draws .BorderStyle = vbBSNone '/* other attributes .ScaleMode = vbTwips .Top = Form1.Top - 10000 '/* move it way off screen .Width = Screen.Width .Visible = False .Font = lv.Font '/* assure Picture1 font matched listview font With .Font .Bold = lv.Font.Bold .Charset = lv.Font.Charset .Italic = lv.Font.Italic .Name = lv.Font.Name .Strikethrough = lv.Font.Strikethrough .Underline = lv.Font.Underline .Weight = lv.Font.Weight .Size = lv.Font.Size End With 'Picture1.Font
iBarHeight = .TextHeight("W") Select Case nSizingType Case sizeNone: iBarHeight = iBarHeight + twipsy Case sizeCheckBox: If (iBarHeight \ twipsy) > 18 Then iBarHeight = iBarHeight + twipsy Else diff = 18 - (iBarHeight \ twipsy) iBarHeight = iBarHeight + (diff * twipsy) + (twipsy * 1) End If Case sizeIcon: diff = imagelist1.ImageHeight - (iBarHeight \ twipsy) iBarHeight = iBarHeight + (diff * twipsy) + (twipsy * 1) End Select .Height = iBarHeight * 2 .Width = lBarWidth Picture1.Line (0, 0)-(lBarWidth, iBarHeight), Bar1Color, BF Picture1.Line (0, iBarHeight)-(lBarWidth, iBarHeight * 2), Bar2Color, BF .AutoSize = True .Refresh End With 'Picture1 lv.Refresh lv.Picture = Picture1.Image Else lv.Picture = Nothing End If 'lv.View = lvwReport SetListViewColor_Exit: On Local Error GoTo 0 Exit Sub SetListViewColor_Error: With lv .Picture = nothing .Refresh End With Resume SetListViewColor_Exit End SubPrivate Sub LoadData(nSizingType As ImageSizingTypes) Dim cnt As Long Dim itmX As ListItem With ListView1 .ListItems.Clear .ColumnHeaders.Clear .ColumnHeaders.Add , , "Number" .ColumnHeaders.Add , , "Time" .ColumnHeaders.Add , , "User" .ColumnHeaders.Add , , "Tag " .View = lvwReport .Sorted = False End With For cnt = 1 To 100 Set itmX = Form1.ListView1.ListItems.Add(, , Format$(cnt, "###")) If nSizingType = sizeIcon Then itmX.SmallIcon = 1 itmX.SubItems(1) = Format$(Time, "hh:mm:ss am/pm") itmX.SubItems(2) = "RGB-T" itmX.SubItems(3) = "SYS-1234" Next Call lvAutosizeControl(Form1.ListView1) End SubPrivate Sub lvAutosizeControl(lv As ListView) Dim col2adjust As Long For col2adjust = 0 To lv.ColumnHeaders.Count - 1 Call SendMessage(lv.hwnd, _ LVM_SETCOLUMNWIDTH, _ col2adjust, _ ByVal LVSCW_AUTOSIZE_USEHEADER) Next End Sub
为ListView增加一个ImageList,并指定ListView的图像列表(普通,小,列头)为ImageList在ListView1.ListItems.Add ,,"Text",ImageList的图像序号
[sizeNone] = 0
[sizeCheckBox]
[sizeIcon]
End Enum
Private Enum LedgerColours
vbledgerWhite = &HF9FEFF
vbLedgerGreen = &HD0FFCC
vbLedgerYellow = &HE1FAFF
vbLedgerRed = &HE1E1FF
vbLedgerGrey = &HE0E0E0
vbLedgerBeige = &HD9F2F7
vbLedgerSoftWhite = &HF7F7F7
vbledgerPureWhite = &HFFFFFF
End Enum'/* Below used for listview column auto-resizing
Private Const LVM_FIRST As Long = &H1000
Private Const LVM_SETCOLUMNWIDTH As Long = (LVM_FIRST + 30)
Private Const LVSCW_AUTOSIZE As Long = -1
Private Const LVSCW_AUTOSIZE_USEHEADER As Long = -2
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Sub Form_Load()
Command1.Caption = "Text Only"
Command2.Caption = "Text && Checks"
Command3.Caption = "Text && Icons"
End Sub
Private Sub Command1_Click()
With ListView1
.Visible = False
.Checkboxes = False
.FullRowSelect = True
Set .SmallIcons = Nothing Call LoadData(sizeNone)
Call SetListViewLedger(ListView1, _
vbLedgerYellow, _
vbLedgerGrey, _
sizeNone)
.Refresh
.Visible = True '/* Restore visibility
End WithEnd Sub
Private Sub Command2_Click() With ListView1
.Visible = False
.Checkboxes = True
.FullRowSelect = True
Set .SmallIcons = Nothing
Call LoadData(sizeCheckBox)
Call SetListViewLedger(ListView1, _
vbLedgerYellow, _
vbLedgerGrey, _
sizeCheckBox)
.Refresh
.Visible = True
End With
End Sub
Private Sub Command3_Click() With ListView1
.Visible = False
.Checkboxes = False
.FullRowSelect = True
Set .SmallIcons = imagelist1
Call LoadData(sizeIcon)
Call SetListViewLedger(ListView1, _
vbLedgerYellow, _
vbLedgerGrey, _
sizeIcon)
.Refresh
.Visible = True
End With
Command1.Enabled = False
End Sub
Private Sub SetListViewLedger(lv As ListView, _
Bar1Color As LedgerColours, _
Bar2Color As LedgerColours, _
nSizingType As ImageSizingTypes) Dim iBarHeight As Long '/* height of 1 line in the listview
Dim lBarWidth As Long '/* width of listview
Dim diff As Long '/* used in calculations of row height
Dim twipsy As Long '/* variable holding Screen.TwipsPerPicture1elY
iBarHeight = 0
lBarWidth = 0
diff = 0
On Local Error GoTo SetListViewColor_Error
twipsy = Screen.TwipsPerPixelY
If lv.View = lvwReport Then
'/* set up the listview properties
With lv
.Picture = Nothing '/* clear picture
.Refresh
.Visible = 1
.PictureAlignment = lvwTile
lBarWidth = .Width
End With ' lv
'/* set up the picture box properties
With Picture1
.AutoRedraw = False '/* clear/reset picture
.Picture = Nothing
.BackColor = vbWhite
.Height = 1
.AutoRedraw = True '/* assure image draws
.BorderStyle = vbBSNone '/* other attributes
.ScaleMode = vbTwips
.Top = Form1.Top - 10000 '/* move it way off screen
.Width = Screen.Width
.Visible = False
.Font = lv.Font '/* assure Picture1 font matched listview font
With .Font
.Bold = lv.Font.Bold
.Charset = lv.Font.Charset
.Italic = lv.Font.Italic
.Name = lv.Font.Name
.Strikethrough = lv.Font.Strikethrough
.Underline = lv.Font.Underline
.Weight = lv.Font.Weight
.Size = lv.Font.Size
End With 'Picture1.Font
iBarHeight = .TextHeight("W") Select Case nSizingType
Case sizeNone:
iBarHeight = iBarHeight + twipsy
Case sizeCheckBox:
If (iBarHeight \ twipsy) > 18 Then
iBarHeight = iBarHeight + twipsy
Else
diff = 18 - (iBarHeight \ twipsy)
iBarHeight = iBarHeight + (diff * twipsy) + (twipsy * 1)
End If
Case sizeIcon:
diff = imagelist1.ImageHeight - (iBarHeight \ twipsy)
iBarHeight = iBarHeight + (diff * twipsy) + (twipsy * 1)
End Select
.Height = iBarHeight * 2
.Width = lBarWidth
Picture1.Line (0, 0)-(lBarWidth, iBarHeight), Bar1Color, BF
Picture1.Line (0, iBarHeight)-(lBarWidth, iBarHeight * 2), Bar2Color, BF
.AutoSize = True
.Refresh
End With 'Picture1
lv.Refresh
lv.Picture = Picture1.Image
Else
lv.Picture = Nothing
End If 'lv.View = lvwReport
SetListViewColor_Exit:
On Local Error GoTo 0
Exit Sub
SetListViewColor_Error:
With lv
.Picture = nothing
.Refresh
End With
Resume SetListViewColor_Exit
End SubPrivate Sub LoadData(nSizingType As ImageSizingTypes)
Dim cnt As Long
Dim itmX As ListItem
With ListView1
.ListItems.Clear
.ColumnHeaders.Clear
.ColumnHeaders.Add , , "Number"
.ColumnHeaders.Add , , "Time"
.ColumnHeaders.Add , , "User"
.ColumnHeaders.Add , , "Tag "
.View = lvwReport
.Sorted = False
End With
For cnt = 1 To 100
Set itmX = Form1.ListView1.ListItems.Add(, , Format$(cnt, "###"))
If nSizingType = sizeIcon Then itmX.SmallIcon = 1
itmX.SubItems(1) = Format$(Time, "hh:mm:ss am/pm")
itmX.SubItems(2) = "RGB-T"
itmX.SubItems(3) = "SYS-1234"
Next
Call lvAutosizeControl(Form1.ListView1)
End SubPrivate Sub lvAutosizeControl(lv As ListView)
Dim col2adjust As Long
For col2adjust = 0 To lv.ColumnHeaders.Count - 1
Call SendMessage(lv.hwnd, _
LVM_SETCOLUMNWIDTH, _
col2adjust, _
ByVal LVSCW_AUTOSIZE_USEHEADER) Next
End Sub