Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0056: Optimale Höhe einer RichTextBox ermitteln

 von 

Beschreibung

Will man die Höhe eines Steuerelementes optimal an den darin enthaltenen Text anpassen, so hilft normalerweise die Eigenschaften PreferredSize mit ihren Untereigenschaften Height und Width. Die RichTextBox bietet zusätzlich die Eigenschaft PreferredHeight. Leider liefern all diese bei der RichTextBox mit automatischem Umbruch unter VB2008 falsche Werte. Der hier gezeigte Weg ermittelt die korrekte Darstellungshöhe.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [13,66 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2008
' Option Strict:    Aus
' Option Explicit:  An
' Option Infer:     An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Deployment
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'  - System.Core
'  - System.Xml.Linq
'  - System.Data.DataSetExtensions
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'  - System.Linq
'  - System.Xml.Linq
'

' ##############################################################################
' ################################# Form1.vb ###################################
' ##############################################################################
Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Me.Load

        rtfBox.Rtf = "{\rtf1\ansi\ansicpg1252\deff0\deflang1031{" & _
            "\fonttbl{\f0\fswiss\fcharset0 Arial;}}" & _
            "\viewkind4\uc1\pard\b\f0\fs48 Das ist grosser Text\par" & _
            "\b0\fs20 Hier ist kleiner Text der aber irgendwann einmal, " & _
            "durch die RTF Box in die n\'e4chste Zeile umgebrochen wird. " & _
            "Keine der Methoden .PreferredHeight, .PreferredSize.Height " & _
            ".GetPreferredSize.Height liefert die korrekte Höhe!\par" & _
            "\b0\fs20 Hier ist kleiner Text der aber irgendwann einmal, " & _
            "durch die RTF Box in die n\'e4chste Zeile umgebrochen wird. " & _
            "Keine der Methoden .PreferredHeight, .PreferredSize.Height " & _
            ".GetPreferredSize.Height liefert die korrekte Höhe!\par" & _
            "\b0\fs20 Hier ist kleiner Text der aber irgendwann einmal, " & _
            "durch die RTF Box in die n\'e4chste Zeile umgebrochen wird. " & _
            "Keine der Methoden .PreferredHeight, .PreferredSize.Height " & _
            ".GetPreferredSize.Height liefert die korrekte Höhe!\par" & _
            "}"

        ' Es ist wichtig, dass keine Scrollbars angezeigt werden, da sonst durch
        ' die verikale Scrollbar Platz weggenommen wird, was dazu führt, dass
        ' der Text vor dem Vergrössern anders umgebrochen wird als nachher:
        rtfBox.ScrollBars = RichTextBoxScrollBars.None
    End Sub

    Private Sub cmdResize_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdResize.Click

        Dim dwPreferredHeight As UInt32 = rtfBox.PreferredHeight
        Dim dwPreferredSize As UInt32 = rtfBox.PreferredSize.Height
        Dim dwGetPreferredSize As UInt32 = _
            rtfBox.GetPreferredSize(New Drawing.Size(rtfBox.Width, 0)).Height

        ' Richtige Höhe = Oberkante des letzten Zeichens + 
        '  Höhe des letzten Zeichens + Breite des Rahmens der rtfBox + 1 Pixel
        rtfBox.Select(rtfBox.Text.Length, 0)
        Dim dwSmartHeight As UInt32 = _
            rtfBox.GetPositionFromCharIndex(rtfBox.Text.Length).Y + _
            rtfBox.SelectionFont.GetHeight() + _
            (rtfBox.Height - rtfBox.ClientSize.Height) + 1

        txtSizeResults.Text = "PreferredHeight: " & dwPreferredHeight
        txtSizeResults.Text &= " PreferredSize.Height: " & dwPreferredSize
        txtSizeResults.Text &= " GetPreferredSize.Height: " & dwGetPreferredSize
        txtSizeResults.Text &= " richtig: " & dwSmartHeight

        rtfBox.Height = dwSmartHeight
    End Sub
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.