Tipp 0112 Text rendern
Autor/Einsender:
Datum:
  Alexander Csadek
27.03.2006
Entwicklungsumgebung: VB.Net 2003
DirectX-Version:   DirectX 9
Um in DirectX 9 Text auf den Bildschirm zu bekommen, gibt es ein eigenes Direct3D-Font-Objekt. Der Zugriff auf dieses Objekt erfolgt über den Namespace Microsoft.DirectX.Direct3DX, das den Direct3D-Namespace erweitert.
Zum Erstellen eines solchen Font-Objektes braucht man einen gültigen 3D-Device und ein System-Font-Objekt. Das System-Font-Objekt kann beispielsweise mit
 
System.Drawing.Font("Arial", 14, FontStyle.Regular, _
      GraphicsUnit.Pixel)
 
erstellt werden. Danach kann im Renderbereich (BeginScene und EndScene) der Text gezeichnet werden. Hierfür gibt es zwei Möglichkeiten, entweder man übergibt der DrawText-Methode ein gültiges Sprite-Objekt oder man lässt es weg. Im zweiten Fall verwendet die DrawText-Methode dann ihr eigenes Sprite-Objekt, was aber dazu führen kann, dass die Performance schlechter ist.
Wirklich Interessant sind die Format-Flags die der Methode mitgegeben werden können.
  DT_LEFT        : linksbündig
  DT_CENTER      : zentriert
  DT_RIGHT       : rechtsbündig
  DT_WORDBREAK   : automatischer Zeilenumbruch
Eine Auflistung aller Flags sind in der MSDN unter DrawTextFormat enthalten.
Der Text wird dann im gewünschten Format in das angegebene Rechteck gerendert.
 
  Private Function CreateDXFont() As Boolean
    Dim systemfont As System.Drawing.Font
    Try
      'System-Font holen
      systemfont = New System.Drawing.Font( _
            "Arial", 14, FontStyle.Regular, GraphicsUnit.Pixel)
      'Font-Objekt erzeugen
      gD3DXFont = New Direct3D.Font(gD3DDevice9, systemfont)
      systemfont.Dispose()
      Return True
    Catch ex As Exception
      Return False
    End Try
  End Function

  Private Sub Render3D()
    Try
      'Prüfen, ob es den Device gibt
      If gD3DDevice9 Is Nothing Then Exit Sub

      'Wurde das Fenster in die TaskBar verkleinert, dann wird
      'nichts gezeichnet
      If (WindowState = FormWindowState.Minimized) Then Exit Sub

      'Minimale Höhe prüfen
      Height = IIf(Height < 50, 50, Height)

      'Bildschirm säubern
      gD3DDevice9.Clear( _
            ClearFlags.Target, System.Drawing.Color.Blue, 1.0F, 0)

      'Szene beginnen
      gD3DDevice9.BeginScene()

      'Sprite Objekt beginnen
      'Hinweis: Text kann auch ohne einem Sprite Objekt gezeichnet
      'werden, aber dadurch kann die Performance leiden.
      gSprite.Begin(SpriteFlags.AlphaBlend)

      'Die Text-Formatierung stehen mit DrawTextFormat zur
      'Verfügung.
      TextRect = New Rectangle(0, 0, Me.ClientSize.Width, 30)
      gD3DXFont.DrawText( _
            gSprite, "DirectX9 und die Ausgabe von Text.", _
            TextRect, DrawTextFormat.Left, _
            System.Drawing.Color.White)

      'Rechtsbündiger Text
      TextRect = New Rectangle(0, 40, Me.ClientSize.Width, 30)
      gD3DXFont.DrawText(gSprite, "Rechtsbündiger Text.", _
            TextRect, DrawTextFormat.Right, _
            System.Drawing.Color.White)

      'Zentrierter Text
      TextRect = New Rectangle(0, 80, Me.ClientSize.Width, 30)
      gD3DXFont.DrawText(gSprite, "Zentrierter Text.", TextRect, _
            DrawTextFormat.Center, System.Drawing.Color.White)

      'Text mit automatischem Zeilenumbruch
      TextRect = New Rectangle(0, 120, Me.ClientSize.Width, 60)
      gD3DXFont.DrawText(gSprite, _
            "Text mit automatischem Zeilenumbruch.", TextRect, _
            DrawTextFormat.Left Or DrawTextFormat.WordBreak, _
            System.Drawing.Color.White)

      'Wenn ihr ohne einem Sprite-Objekt arbeitet, dann muss der
      'Aufruf so aussehen:
      'gD3DXFont.DrawText(Nothing, _
      '      "DirectX9 und die Ausgabe von Text.", TextRect, _
      '      DrawTextFormat.Left, System.Drawing.Color.White)

      'Sprite Objekt beenden
      gSprite.End()

      'Szene beenden
      gD3DDevice9.EndScene()

      'Szene präsentieren
      gD3DDevice9.Present()

    Catch ex As Exception
      MessageBox.Show("Fehler beim Rendern der Szene." & vbCrLf & _
            ex.Message.ToString())
      Me.Close()
    End Try
  End Sub
 
Hinweis
Dieser Tipp wurde mit der Managed DirectX Assembly Version 1.0.1901.0 erstellt, und um diesen Tipp ausführen zu können, muss die DirectX 9 for Managed Code Runtime als Verweis in das Projekt eingebunden werden. 

Windows-Version
98/SE
ME
NT
2000
XP
Vista
Win 7


Download  (7 kB) Downloads bisher: [ 513 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Tipps | Projekte | Tutorials | Bücherecke | VB-/VBA-Tipps | API-Referenz | Komponenten | VB.Net-Forum | VB/VBA-Forum | DirectX-Forum | Foren-Archiv | DirectX | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Montag, 23. Januar 2012