|
Die Abstände der Icons in einem ListView-Steuerelement in der Icons-Ansicht (Eigenschaft View gleich lvwIcon oder lvwSmallIcon) werden automatisch von den Einstellungen in den Bildschirmeigenschaften festgelegt. Sie können zwar die Icons über deren Left- und Top-Eigenschaften beliebig positionieren, wenn Sie die Eigenschaft Arrange des ListViews auf lvwNone setzen. Doch sobald Sie die Icons horizontal oder vertikal im Raster ausrichten wollen (etwa, weil der Anwender die Icons verschoben hat, oder nach einer Größenänderung des ListViews), indem Sie Arrange auf lvwAutoLeft oder lvwAutoTop setzen, kommen wieder die Systemeinstellungen zur Geltung.
Sie können jedoch auf die Anordnung per Arrange-Eigenschaft verzichten. Lassen Sie diese auf lvwNone eingestellt, können Sie ja die Icons über die Left- und Top-Eigenschaft frei positionieren - also auch in einem beliebigen, von Ihnen vorgegebenen Raster.
Der folgenden Prozedur LvwArrangeIcons übergeben Sie das betreffende ListView-Steuerelement, eine der ListArrangeConstants (lvwNone oder ungültige Werte bleiben wirkungslos, die beiden anderen, lvwAutoLeft und lvwAutoTop entsprechen dem Original), die gewünschte Spaltenbreite und optional die gewünschte Zeilenhöhe (fehlt diese, wird der Wert der Spaltenbreite auch für die Zeilenhöhe übernommen), beide in TWIPS.
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function GetClientRect Lib "user32" _
(ByVal hwnd As Long, lpRect As RECT) As Long
Public Sub LvwArrangeIcons(ListView As ListView, _
ByVal Arrange As ListArrangeConstants, ByVal ColWidth As Single, _
Optional ByVal RowHeight As Single)
Dim rc As Long
Dim nRect As RECT
Dim nRowsCols As Long
Dim l As Long
Dim nLeftTop As Single
Select Case Arrange
Case lvwAutoLeft, lvwAutoTop
Case Else
Exit Sub
End Select
With ListView
Select Case .View
Case lvwIcon, lvwSmallIcon
Case Else
Exit Sub
End Select
If RowHeight = 0 Then
RowHeight = ColWidth
End If
Select Case True
Case ColWidth = 0
Err.Raise 5
Case RowHeight = 0
Err.Raise 5
End Select
.Arrange = lvwNone
GetClientRect ListView.hwnd, nRect
Select Case Arrange
Case lvwAutoLeft
nRowsCols = ((nRect.Bottom * Screen.TwipsPerPixelY) \ RowHeight) - 1
With .ListItems
Do
For rc = 0 To nRowsCols
l = l + 1
If l > .Count Then
Exit Do
End If
With .Item(l)
.Left = nLeftTop
.Top = rc * RowHeight
End With
Next 'r
nLeftTop = nLeftTop + ColWidth
Loop
End With
Case lvwAutoTop
nRowsCols = ((nRect.Right * Screen.TwipsPerPixelY) \ ColWidth) - 1
With .ListItems
Do
For rc = 0 To nRowsCols
l = l + 1
If l > .Count Then
Exit Do
End If
With .Item(l)
.Top = nLeftTop
.Left = rc * ColWidth
End With
Next 'r
nLeftTop = nLeftTop + RowHeight
Loop
End With
End Select
End With
End Sub
|