|
TextWidth
und TextHeight
sind praktische Methoden von Container-Objekten wie Form, PictureBox,
UserControl, Printer usw. Sie ermitteln die Breite bzw. Höhe eines
Text-Strings für den in diesem Objekt aktuell gewählten
Schrift-Font. Bei anderen Objekten und Steuerelementen vermisst man
diese Möglichkeit jedoch. Solange ein Container-Objekt mit gleichem
Font greifbar ist, können Sie zur Not darauf ausweichen - da ja nur
eine "theoretische" Wertermittlung erfolgt und nichts
tatsächlich auf dem betreffenden ausgegeben wird, kann also auch
nichts passieren.
Unterscheiden sich jedoch die Fonts, wird es umständlicher. Sie
können eine Objekt-Variable des Datentyps StdFont
deklarieren und ihr den aktuellen Font des Container-Objekts zur
Sicherung zuweisen. Dann können Sie den Font ändern bzw. den des
"hilflosen" Steuerelements vorübergehend zuweisen und
TextWidth oder TextHeight verwenden. Anschließend sollten Sie das
gesicherte Font-Objekt wieder dem hilfsweise zweckentfremdeten
Container-Objekt zurückgeben. Zum Beispiel:
Dim nFont As StdFont
Set nFont = Form1.Font
Set Form1.Font = Text1.Font
TextBreite = Form1.TextWidth(Text1.Text)
TextHöhe = Form1.TextHeight(Text1.Text)
Set Form1.Font = nFont
Doch was tun, wenn gar kein Container-Objekt greifbar ist, etwa
innerhalb eines Funktionsaufrufs in einem Standard-Modul oder in
einer ActiveX-DLL? Natürlich können Sie extra ein Container-Objekt
beim Funktionsaufruf mit übergeben. Eine einfachere Lösung bietet
wieder einmal das API mit der Funktion GetTextExtentPoint32.
Sie benötigt lediglich eine Geräte-Kontext
(Device Context/DC). Als Eigenschaft stellen zwar auch
nur wenige Steuerelemente und Objekte einen Geräte-Kontext ( hDC-Eigenschaft)
zur Verfügung. Aber das ist halb so schlimm, da dennoch die meisten
wiederum mit einem Fenster-Handle ( hWnd-Eigenschaft)
dienen können. Anhand eines Fenster-Handles können Sie mittels der
API-Funktion GetDC
den benötigten Geräte-Kontext erhalten. Bei Steuerelementen, deren
Entwickler Ihnen allerdings beides unterschlagen haben, oder bei
fensterlosen Steuerelementen wie Image und Label, sind Sie
allerdings aufgeschmissen. Das heißt, nicht ganz - wenn Sie die
Eigenschaft AutoSize eines Labels auf True setzen, finden Sie
automatisch die gesuchten Werte für den Inhalt der Caption
Eigenschaft des Labels in der Width- bzw. der Height-Eigenschaft (in
der VB-Steinzeit war dieser Trick die einzige API-freie Lösung).
Doch nun zum Einsatz der API-Funktion GetTextExtentPoint32. Wie
bei den meisten API-Funktionen ist es nicht mit einem einfachen
Funktionsaufruf getan - der drum herum notwendige Kleinkram lohnt
wie immer die Verpackung in eine Hilfsfunktion. Beachten Sie jedoch,
dass alle diese Funktionen die gesuchten Werte in der Maßeinheit
Pixels liefern!
Am schnellsten ist natürlich die direkte Übergabe eines zur
Verfügung stehenden Geräte-Kontexts (hDC). Die erste Hilfsfunktion
TextSizeDC begnügt sich mit einem solchen und dazu dem Text, dessen
Breite und Höhe ermittelt werden soll. Dazu übergeben Sie die zwei
vorab deklarierte Variablen in den Rückgabe-Parametern Width und
Height.
Private Type SIZE
Width As Long
Height As Long
End Type
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) _
As Long
Private Declare Function GetTextExtentPoint32 Lib "gdi32" _
Alias "GetTextExtentPoint32A" (ByVal hDC As Long, _
ByVal lpsz As String, ByVal cbString As Long, lpSize As SIZE) _
As Long
Public Sub TextSizeDC(ByVal hDC As Long, Text As String, _
Width As Single, Height As Single)
Dim nSize As SIZE
GetTextExtentPoint32 hDC, Text, Len(Text), nSize
With nSize
Width = .Width
Height = .Height
End With
End Sub
Steht Ihnen jedoch nur ein Fenster-Handle zur Verfügung,
verwenden Sie die Funktion TextSizeWnd, und übergeben dieses
anstelle des hDC-Wertes als ersten Parameter. In der Funktion wird
der Geräte-Kontext dann mit GetDC ermittelt.
Public Sub TextSizeWnd(ByVal hWnd As Long, Text As String, _
Width As Single, Height As Single)
Dim nSize As SIZE
GetTextExtentPoint32 GetDC(hWnd), Text, Len(Text), nSize
With nSize
Width = .Width
Height = .Height
End With
End Sub
Die dritte Funktion TextSize hat einen etwas allgemeingültigeren
Charakter. Ihr übergeben Sie einfach ein Objekt bzw. Steuerelement.
Die Funktion versucht dann per Trial&Error (im wahrsten Sinne)
herauszufinden, ob das Objekt über eine hDC- oder eine
hWnd-Eigenschaft verfügt. Gehen diese Versuche ins Leere, gibt
diese Funktion (genau genommen sind die beiden ersteren keine
Funktionen, sondern Prozeduren) True als Rückgabewert zurück.
Public Function TextSize(Object As Object, Text As String, _
Width As Single, Height As Single) As Boolean
Dim nSize As SIZE
Dim nDC As Long
Dim nWnd As Long
On Error Resume Next
nDC = Object.hDC
If Err.Number Then
Err.Clear
nWnd = Object.hWnd
If Err.Number Then
Err.Clear
TextSize = True
Exit Sub
End If
nDC = GetDC(nWnd)
End If
GetTextExtentPoint32 nDC, Text, Len(Text), nSize
With nSize
Width = .Width
Height = .Height
End With
End Sub

|