|
Wenn Sie die am weitesten rechts stehende (oder auch eventuell einzige) Spalte in einem ListView-Steuerelement im Report-Modus automatisch an die Innenbreite des ListView-Steuerelements anpassen möchten, benötigen Sie zunächst diese tatsächliche Innenbreite. Diese liefert Ihnen die API-Funktion GetClientRect. Dieser übergeben Sie das Fenster-Handle (hWnd) des ListViews und eine benutzerdefinierte Variable des Typs RECT (mit den Elementen Left, Top, Right und Bottom als Datentyp Long). Die Funktion gibt immer die Innenmaße eines Steuerelements (bzw. Fensters) in Pixels zurück - die Breite im Element Right, die Höhe im Element Bottom. Die Elemente Left und Top sind bei dieser Funktion immer gleich 0.
Ist die rechte Spalte eines ListViews sichtbar, liegt also deren Left-Position innerhalb der Innenbreite, soll die Spalte so breit werden, wie die Differenz aus Innenbreite und Left-Position der Spalte, um den verbleibenden Raum ganz auszufüllen. Liegt die Left-Position jenseits der Innenbreite, können Sie die Breite der Spalte unberührt lassen, damit sie durch horizontales Rollen erreichbar und sichtbar bleibt. Allerdings empfiehlt es sich, eine Mindestbreite festzulegen, damit die Spalte nicht auf die Breite 0 zusammengeschoben wird, wenn das ListView-Steuerelement beispielsweise bei einer automatischen Anpassung von dessen Größe an seinen Container kontinuierlich zusammengeschoben wird.
Die Hilfs-Funktion ListViewAdjustRightColumn erledigt die Anpassung der rechten Spalte. Als Parameter übergeben Sie ihr das betreffende ListView-Steuerelement und optional die gewünschte Mindestbreite.
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 ListViewAdjustRightColumn(ListView As ListView, _
Optional ByVal MinWidth As Single)
Dim nRect As RECT
With ListView
GetClientRect .hwnd, nRect
nRect.Right = nRect.Right * Screen.TwipsPerPixelX
With .ColumnHeaders(.ColumnHeaders.Count)
If .Left < nRect.Right Then
.Width = nRect.Right - .Left
End If
If .Width < MinWidth Then
.Width = MinWidth
End If
End With
End With
End Sub
|