ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 31.01.2000

Diese Seite wurde zuletzt aktualisiert am 31.01.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Text x breit x hoch?

Zurück...


Anzeige

(-hg) mailto:hg_textsize@aboutvb.de

MSDN Library - VB TextWidthTextWidth und MSDN Library - VB TextHeightTextHeight 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 MSDN Library - VB StdFontStdFont 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 MSDN Library - API GetTextExtentPoint32GetTextExtentPoint32. Sie benötigt lediglich eine MSDN Library - API Geräte-KontextGeräte-Kontext (Device Context/DC). Als Eigenschaft stellen zwar auch nur wenige Steuerelemente und Objekte einen Geräte-Kontext (MSDN Library - VB hDChDC-Eigenschaft) zur Verfügung. Aber das ist halb so schlimm, da dennoch die meisten wiederum mit einem Fenster-Handle (MSDN Library - VB hWndhWnd-Eigenschaft) dienen können. Anhand eines Fenster-Handles können Sie mittels der API-Funktion MSDN Library - API GetDCGetDC 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


Modul modTextSize (modTextSize.bas - ca. 1,6 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikel

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer