VB.NET-Tipp 0056: Optimale Höhe einer RichTextBox ermitteln
von Danielo
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: | 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: |
' 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.