vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Grafik & Zeichnen22.03.05
DrawText-Funktion

Diese Funktion zeichnet Text auf ein angegebenes Gerät, wobei bestimmte Verhaltensweisen für die Schriftanordnung und Formatierung festgelegt werden können.

Betriebssystem:  Win95, Win98, WinNT 3.1, Win2000, WinMEViews:  12.281 

Deklaration:

Declare Function DrawText Lib "user32" _
  Alias "DrawTextA" ( _
  ByVal hDC As Long, _
  lpStr As String, _
  ByVal nCount As Long, _
  lpRect As RECT, _
  ByVal wFormat  As Long) As Long

Beschreibung:
Diese Funktion zeichnet Text auf ein angegebenes Gerät, wobei bestimmte Verhaltensweisen für die Schriftanordnung und Formatierung festgelegt werden können.

Parameter:
hDCErwartet das Handle des Gerätes auf dem der Text gezeichnet werden soll.
lpStrErwartet einen Puffer, der mit den Zeichen, die gezeichnet werdensollen, gefüllt ist. Bei bestimmten "uFormat"-Konstanten kann dieser Puffer auch mit nicht dargestellten Zeichen gefüllt werden.
nCountErwartet die Größe des Puffers in Bytes.
lpRectErwartet eine RECT-Struktur, die mit den Koordinaten, in denen der Text gezeichnet werdensoll, gefüllt ist.
wFormatErwartet eine der folgenden Konstanten diebeschreiben, wie der Text ausgegeben werden soll.

wFormat Konstanten:

Const DT_BOTTOM = &H8
' Der  Text  wird  am  unterem  Rand  ausgerichtet  (Nur  in  Verbindung  mit  DT_SINGLELINE)
 
Const DT_CALCRECT = &H400
' Die Funktion füllt die RECT-Struktur mit den Koordinaten, die für das 
' Zeichnen des Textes benötigt werden, zeichnet den Text aber nicht
 
Const DT_CENTER = &H1
' Der Text wird horizontal zentriert
 
Const DT_EDITCONTROL = &H2000
' Zeichnet den Text, wie es eine Textbox tun würde, nur teilweise sichtbare  
' Zeilen bei zu knapp berechneten übergebenen Koordinaten werden nicht gezeichnet
 
Const DT_END_ELLIPSIS = &H8000
' Der übergebene Puffer mit dem zu zeichnenden Text wird mit dem Text 
' gefüllt, der nicht in angegebenen Koordinaten dargestellt werden kann (Nur 
' in Verbindung mit DT_MODIFYSTRING)
 
Const DT_EXPANDTABS = &H40
' Zeichnet TAB-Zeichen mit 8 Leerzeichen (Nicht in Verbindung mit  
' DT_WORD_ELLIPSIS, DT_PATH_ELLIPSIS und DT_END_ELLIPSIS)
 
Const DT_EXTERNALLEADING = &H200
' Fügt jeder Zeile die Höhe der Externen Führung hinzu
 
Const DT_HIDEPREFIX = &H100000
' (Windows 2000/XP) Zeichnet die auf einem &-Zeichen folgenden Unterstriche 
' nicht, die &-Zeichen werden aber wie bisher ausgeblendet
 
Const DT_INTERNAL = &H1000
' Benutzt die Systemschriftart um die benötigten Koordinaten zu berechnen
 
Const DT_LEFT = &H0
' Der Text wird links ausgerichtet
 
Const DT_MODIFYSTRING = &H10000
' Der übergebene Puffer wird mit den Wörtern oder Zeichen gefüllt die aus  
' Platzmangel nicht gezeichnet werden konnten (Nur in Verbindung mit  
' DT_END_ELLIPSIS oder DT_PATH_ELLIPSIS)
 
Const DT_NOCLIP = &H100
' Der Text wird an den angegebenen Koordinaten nicht abgeschnitten falls der 
' Platz nicht ausreichend ist
 
Const DT_NOFULLWIDTHCHARBREAK = &H80000
' (Windows 98, ME, NT, 2000, XP) Es werden Doppelzeichen für Zeilenumbrüche  
' verwendet (nicht in Verbindung mit DT_WORDBREAK)
 
Const DT_NOPREFIX = &H800
' Zeichnet die auf einem &-Zeichen folgendenden Unterstriche nicht, die  
' &-Zeichen werden normal angezeigt
 
Const DT_PATH_ELLIPSIS = &H4000
' Ersetzt Buchstaben in der Mitte des übergebenen Strings damit er in den  
' Koordinaten gezeichnet werden kann (nur in Verbindung mit DT_MODIFYSTRING)
 
Const DT_PREFIXONLY = &H200000
' (Windows 2000, XP) Zeichnet bei Verwendung von &-Zeichen nur die Unterstriche
 
Const DT_RIGHT = &H2
' Der Text wird rechts ausgerichtet
 
Const DT_RTLREADING = &H20000
' Der Text wird von Rechts nach Links gezeichnet wenn ein Hebräischer Font gesetzt ist
 
Const DT_SINGLELINE = &H20
' Der Text wird in einer einzelnen Zeile gezeichnet, VBCrLf-Zeichen werden ignoriert
 
Const DT_TABSTOP = &H80
' Setzt die Anzahl der Leerzeichen für ein Tab-Zeichen, die Bits 8 bis 15 
' erwarten die Anzahl der Leerstellen
 
Const DT_TOP = &H0
' Der Text wird oben ausgerichtet
 
Const DT_VCENTER = &H4
' Der Text wird vertikal zentriert (nur in Verbindung mit DT_SINGLELINE)
 
Const DT_WORDBREAK = &H10
' Ist eine Zeile zu lange für die angegebenen Koordinaten, so wird zwischen  
' den benötigten Wörtern ein VBCrLf-Zeichen eingefügt
 
Const DT_WORD_ELLIPSIS = &H40000
' Der übergebene Puffer wird mit den Wörtern gefüllt die in den angegebenen  
' Koordinaten aus Platzgründen nicht dargestellt werden konnten

Rückgabewert:
Ist die Funktion erfolgreich, so wird die Höhe des gezeichneten Textes zurückgegeben. Wurde eine der "DT_VCENTER" oder "DT_BOTTOM"-Konstanten gesetzt, so wird der Offset von der "Top"-Position des RECTS bis zumEnde des gezeichneten Textes zurückgegeben. Ist die Funktion nicht erfolgreich so wird derWert "0" zurückgegeben. Unter Windows NT, 2000 und XP können Sie die GetLastError-Funktion für erweiterte Fehlerinformationen aufrufen.

Beispiel:

Private Declare Function DrawCaption Lib "user32" ( _
  ByVal hWnd As Long, _
   ByVal hDC As Long, _
  pcRect As RECT, _
  ByVal uFlags As Long) As Long
Private Declare Function DrawEdge Lib "user32" ( _
  ByVal hDC As Long, _
  qrc As RECT, _
  ByVal edge As Long, _
  ByVal grfFlags As Long) As Long
Private Declare Function DrawFocusRect Lib "user32" ( _
  ByVal hDC As Long, _
   lpRect As RECT) As Long
Private Declare Function DrawFrameControl Lib "user32" ( _
  ByVal hDC As Long, _
   lpRect As RECT, _
  ByVal uType As Long, _
  ByVal uState As Long) As Long
Private Declare Function DrawText Lib "user32" _
  Alias "DrawTextA" ( _
  ByVal hDC  As Long, _
  lpStr As String, _
  ByVal nCount As Long, _
  lpRect As RECT, _
  ByVal wFormat As Long) As Long
Private Declare Function SetRect Lib "user32" ( _
  lpRect As RECT, _
  ByVal X1 As Long, _
  ByVal Y1 As Long, _
  ByVal X2 As Long, _
  ByVal Y2 As Long) As Long
Private Declare Function PtInRect Lib "user32.dll" ( _
  lpRect As RECT, _
  ByVal x  As Long, _
  ByVal y As Long) As Long
 
Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type
 
' DrawText wFormat-Konstanten
Private Const DT_CENTER = &H1 ' Der Text wird horizontal Zentriert
Private Const DT_SINGLELINE = &H20 ' Der Text wird in einer einzelnen Zeile  
' gezeichnet, VBCrLf-Zeichen werden ignoriert
Private Const DT_VCENTER = &H4 ' Der Text wird vertikal Zentriert (nur in  
' Verbindung mit DT_SINGLELINE)
 
' DrawFrameControl uState-Konstanten
Private Const DFCS_BUTTONPUSH = &H10 ' (DFC_BUTTON) Standard Button
Private Const DFCS_CAPTIONCLOSE = &H0 ' (DFC_CAPTION) Schließensymbol der Titelleiste 
Private Const DFCS_FLAT = &H4000 ' Das Objekt ist flach
Private Const DFCS_PUSHED = &H200 ' Das Objekt ist gedrückt
 
' DrawFrameControl uType-Konstanten
Private Const DFC_BUTTON = 4 ' Standard Button
Private Const DFC_CAPTION = 1 ' Titelleiste
 
' DrawEdge grfFlags-Konstanten
Private Const BF_TOP = &H2 ' Der obere Rahmen wird gezeichnet
Private Const BF_RIGHT = &H4 ' Der rechte Rahmen wird gezeichnet
Private Const BF_LEFT = &H1 ' Der linke Rahmen wird gezeichnet
Private Const BF_BOTTOM = &H8 ' Der untere Rahmen wird gezeichnet
Private Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM) 
' Es  werden alle Seiten des Rahmens gezeichnet
 
' DrawEdge edge-Konstanten
Private Const BDR_RAISEDOUTER = &H1 ' Der äußere Rahmen steigt an
Private Const BDR_SUNKENINNER = &H8 ' Der innere Rahmen sinkt ab
Private Const EDGE_BUMP = (BDR_RAISEDOUTER Or BDR_SUNKENINNER) 
' Eine Kombination aus BDR_RAISEDOUTER und BDR_SUNKENINNER
 
' DrawCaption uFlags-Konstanten
Private Const DC_ACTIVE = &H1 ' Zeichnet eine aktive Titelleiste
Private Const DC_GRADIENT = &H20 ' (ab Windows 98) Benutz den Verlauf für  
' die Titelleiste
Private Const DC_ICON = &H4 ' Zeichnet das Icon in der Titelleiste (VB macht  
' da einen Strich durch, wenn das Fenster keinen Rahmen hat)
Private Const DC_TEXT = &H8 ' Zeichnet den Text für die Titelleiste
 
Dim TitelBar As RECT, TBClose As RECT, CloseState As Long, WorkArea As RECT
Dim CMDButton As RECT, ButtonState As Long, CMDHaveFocus As Boolean,  _
FoucsRect As RECT
' Fensterbereiche festlegen
' (Eigenschaft setzen nicht vergessen: Me.BorderStyle = 0 und  
' Me.ShowInTaskbar = True)
Private Sub Form_Load()
  Dim Retval As Long
 
  Me.ScaleMode = vbPixels
 
  ' Titelleiste setzen
  Retval = SetRect(TitelBar, 0, 0, Me.ScaleWidth, 18)
 
  ' Titelleistenbutton setzen
  Retval = SetRect(TBClose, Me.ScaleWidth - 18, 2, Me.ScaleWidth - 2, 16)
 
  ' Arbeitsbereich setzen
  Retval = SetRect(WorkArea, 0, 18, Me.ScaleWidth - 1, Me.ScaleHeight)
 
  ' Commandbutton setzen
  Retval = SetRect(CMDButton, (Me.ScaleWidth / 2) - 80, (Me.ScaleHeight  _
  / 2) - 30, Me.ScaleWidth / 2, Me.ScaleHeight / 2)
 
  ' Fokusrechteck des Commandbutton setzen
  Retval = SetRect(FoucsRect, (Me.ScaleWidth / 2) - 78, (Me.ScaleHeight  _
  / 2) - 28, Me.ScaleWidth / 2 - 2, Me.ScaleHeight / 2 - 2)
End Sub
' Zeichnen der Objekte
Private Sub Form_Paint()
  Dim Retval As Long
 
  ' Titelleiste zeichnen
  Retval = DrawCaption(Me.hWnd, Me.hDC, TitelBar, DC_ACTIVE Or  _
  DC_GRADIENT Or DC_ICON Or DC_TEXT)
 
  ' Titelleisten Button zeichnen
  Retval = DrawFrameControl(Me.hDC, TBClose, DFC_CAPTION,  _
  DFCS_CAPTIONCLOSE Or CloseState)
 
  ' Arbeitsbereich zeichnen
  Retval = DrawEdge(Me.hDC, WorkArea, EDGE_BUMP, BF_RECT)
 
  ' Commandbutton zeichnen
  Retval = DrawFrameControl(Me.hDC, CMDButton, DFC_BUTTON,  _
  DFCS_BUTTONPUSH Or ButtonState)
 
  ' Text des Commandbuttons Zeichnen
  Retval = DrawText(Me.hDC, ByVal "Command1", Len("Command1"),  _
  CMDButton, DT_CENTER Or DT_VCENTER Or DT_SINGLELINE)
 
  ' Focus zeichnen ?
  If CMDHaveFocus Then
    Retval = DrawFocusRect(Me.hDC, FoucsRect)
  End If
End Sub
' Buttonveräderungen anzeigen
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As _
Single, y As Single)
  Select Case 1
  Case PtInRect(CMDButton, x, y)
    If ButtonState = 0 Then
      ButtonState = DFCS_FLAT
      Me.Refresh
    End If
 
  Case PtInRect(TBClose, x, y)
    If CloseState = 0 Then
      CloseState = DFCS_FLAT
      Me.Refresh
    End If
 
  Case Else
    If ButtonState = DFCS_FLAT Then
      ButtonState = 0
      Me.Refresh
    End If
    If CloseState = DFCS_FLAT Then
      CloseState = 0
      Me.Refresh
    End If
  End Select
End Sub
' Klick eines Buttons simulieren
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As _
  Single, y As Single)
  Select Case 1
  Case PtInRect(CMDButton, x, y)
    ButtonState = DFCS_PUSHED
    Me.Refresh
 
  Case PtInRect(TBClose, x, y)
    CloseState = DFCS_PUSHED
    CMDHaveFocus = False
    Me.Refresh
  End Select
End Sub
' Ereignis beim Klicken eines Buttons auslösen
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single,  _
y As Single)
  Select Case 1
  Case PtInRect(CMDButton, x, y)
    ButtonState = 0
    CMDHaveFocus = True
    Me.Refresh
    MsgBox "Sie haben Command1 gedrückt"
 
  Case PtInRect(TBClose, x, y)
    CloseState = 0
    Me.Refresh
    Unload Me
 
  Case Else
    ButtonState = 0
    CloseState = 0
    Me.Refresh
  End Select
End Sub

 
 
Copyright ©2000-2019 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.