|
Was tun, wenn ein String zu lang ist, um in eine vorgegebene
Breite zu passen? Eine Möglichkeit wäre, den String in einer
Schleife so lange um ein Zeichen zu verkürzen, bis er passt. Da im
allgemeinen eine solche Verkürzung durch Auslassungspunkte ("Ellipsis")
angedeutet wird, müssten Sie die Punkte auch noch bei der
Berechnung berücksichtigen. Besonders elegant und schnell ist das
jedoch nicht.
Viel schneller und perfekt wird die Aufgabe von der API-Funktion DrawText
erledigt. Das ist zwar eigentlich eine Zeichen-Funktion zur Ausgabe
von Text. Sie kann aber auch lediglich einen String so kürzen und
zugleich mit Auslassungspunkten versehen, so dass er in die
vorgegebene Breite passt. In der Regel werden die Auslassungpunkte
lediglich angehängt. Bei Strings, die eine Pfadangabe darstellen
(genauer gesagt, bei Strings, die das Zeichen "\"
enthalten), werden die Auslassungspunkte möglichst so innerhalb des
Strings eingesetzt, dass noch möglichst viel und sinnvoll vom Ende
der Pfadangabe zu erkennen ist. Sie dürften dieses Erscheinungsbild
mindestens aus Menüs kennen, die die Auswahl zuletzt bearbeiteter
Dateien anbieten.
Die beiden Hilfsfunktionen ShortenPath und ShortenString kapseln
die Aufrufe von DrawText und samt der notwendigen Parameter. Sie
übergeben den Gerätekontext (Eigenschaft hDC beispielsweise eines
Forms), den anzupassenden String und die Breite (in Pixels!), in die
der String eingepasst werden soll. Der Rückgabewert der Funktionen
enthält dann den angepassten String. Reicht die vorgegebene Breite
aus, um den String komplett darzustellen, wird er natürlich nicht
modifiziert.
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function DrawText Lib "user32" _
Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, _
ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) _
As Long
Private Const DT_PATH_ELLIPSIS = &H4000
Private Const DT_END_ELLIPSIS = &H8000
Private Const DT_MODIFYSTRING = &H10000
Private Const DT_SINGLELINE = &H20
Public Function ShortenPath(ByVal hDC As Long, _
ByVal Path As String, ByVal Width As Long) As String
Dim nRect As RECT
Dim nPos As Long
Dim nPath As String
nRect.Right = Width
Path = Path & Chr$(0)
DrawText hDC, Path, -1, nRect, _
DT_MODIFYSTRING Or DT_SINGLELINE Or DT_PATH_ELLIPSIS
nPos = InStr(Path, Chr$(0))
If nPos Then
ShortenPath = Left$(Path, nPos - 1)
Else
ShortenPath = Path
End If
End Function
Public Function ShortenString(ByVal hDC As Long, _
ByVal Str As String, ByVal Width As Long) As String
Dim nRect As RECT
Dim nPos As Long
Dim nPath As String
nRect.Right = Width
Str = Str & Chr$(0)
DrawText hDC, Str, -1, nRect, _
DT_MODIFYSTRING Or DT_SINGLELINE Or DT_END_ELLIPSIS
nPos = InStr(Str, Chr$(0))
If nPos Then
ShortenString = Left$(Str, nPos - 1)
Else
ShortenString = Str
End If
End Function
|