Как обернуть длинное слово с 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
Другие вопросы по тегам