Как обернуть длинное слово с TextRenderer DrawText в vb.net
Как нарисовать длинное слово в форме с разрывом слов с помощью TextRenderer DrawText() в vb.net? Я думал, что это простой вопрос, и я попробовал все комбинации TextFormatFlags, но я не могу найти ничего решения. Кто-нибудь может помочь? Вот образец:
sText = "C:\Users\abiga\OneDrive\Works\AdreNDSzinkron\bin\Debug\AdreService.exe"
TextRenderer.DrawText(e.Graphics, sText, Font, New Rectangle(0, 0, Me.Width, Me.Height),
Me.Color,TextFormatFlags.<what is the correct flag?>)
Мне нужно это (ничего не вырезано):
C:\Users\abiga\OneDrive\Works\Adr
eNDSzinkron\bin\Debug\AdreService
.exe
Неправильные решения:
C:\Users\abiga\OneDrive\Works\Adr
C:\Users\abiga\OneDrive\Works\...
C:\Users\ab...bug\AdreService.exe
Спасибо за помощь!
2 ответа
Первая попытка TextFormatFlags.WordBreak or TextFormatFlags.TextBoxControl
как твои флаги.
Документы говорят:
WordBreak: разрывает текст в конце слова
TextBoxControl: указывает, что текст должен быть отформатирован для отображения в элементе управления TextBox
Объединение этих флагов должно дать ожидаемый результат.
Если это не работает, попробуйте использовать Graphics.DrawString
вместо:
e.Graphics.DrawString(sText, Font, Me.Color, New RectangleF(0, 0, Me.Width, Me.Height))
Просто чтобы добавить некоторые детали реализации, которые могут быть использованы для оценки различий между TextRenderer .DrawText()
метод и метод PaintEventArgs.Graphics.DrawString ().
При нажатии на форму два метода показывают их различия в измерении и визуализации текста.
Dim sText As String() =
New String() {
"C:\FirstLevelDir\FirstSubDir\AnotherDir\ADeepLevelDir\LostDeepDir\SomeFile.exe",
"C:\FirstLevelDir\AnotherFirstSubDir\AnotherGreatDir\AwsomeDeepLevelDir\LostDeepDir\Some.exe",
"C:\FirstLevelDir\SomeFirstSubDir\SomeOtherDir\AnotherDeepLevelDir\VeryLostDeepDir\FinalBuriedDir\SomeFile.exe"
В форме Click()
событие, розыгрыш sText
линий, измеряя их ширину и высоту с помощью TextRenderer.MeasureText() и печатая их с помощью TextRenderer.DrawText()
Private Sub Form1_Click(sender As Object, e As EventArgs) Handles Me.Click
Dim _RelPositionY As Integer = 0
Dim _LineSpacing As Single = 0.5
Dim _ParagraphSpacing As Integer = CInt(Me.Font.Height * _LineSpacing)
Dim _Flags As TextFormatFlags = TextFormatFlags.Top Or
TextFormatFlags.WordBreak Or
TextFormatFlags.TextBoxControl
For x = 0 To sText.Length - 1
Dim _size As Size = TextRenderer.MeasureText(
Me.CreateGraphics(), sText(x), Me.Font,
New Size(Me.ClientSize.Width, Me.Height), _Flags)
TextRenderer.DrawText(Me.CreateGraphics(), sText(x), Me.Font,
New Rectangle(0, _RelPositionY, _size.Width, _size.Height),
Me.ForeColor,
_Flags)
_RelPositionY += _size.Height + _ParagraphSpacing
Next
End Sub
В форме Paint()
событие, розыгрыш sText
линии, измеряя их ширину и высоту, используя .Graphics.MeasureString() и печатайте их с помощью .Graphics.DrawString()
Обратите внимание, что размер текста в штучной упаковке в TextRenderer относится к Form.ClientSize, а в Graphics - к полной ширине формы.
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
Dim _RelPositionY As Single = 0
Dim _LineSpacing As Single = 0.5
Dim _ParagraphSpacing As Single = CSng(Me.Font.Height) * _LineSpacing
Dim _Flags As StringFormatFlags = StringFormatFlags.LineLimit Or
StringFormatFlags.FitBlackBox
For x = 0 To sText.Length - 1
Dim _sizeF As SizeF = e.Graphics.MeasureString(sText(x), Me.Font,
New SizeF(CSng(Me.Width), CSng(Me.Height)),
New StringFormat(_Flags))
e.Graphics.DrawString(sText(x), Me.Font,
New SolidBrush(Me.ForeColor),
New RectangleF(0, _RelPositionY, _sizeF.Width, _sizeF.Height))
_RelPositionY += _sizeF.Height + _ParagraphSpacing
Next
End Sub