3

如何在 vb.net 中使用 TextRenderer DrawText() 在带有断字的表单上绘制长单词?我认为这是一个简单的问题,我尝试了所有 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

谢谢您的帮助!

4

2 回答 2

3

首先尝试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))

于 2018-01-10T12:41:28.407 回答
2

只是添加一些可用于评估TextRendererDrawText()方法和GraphicsDrawString()方法之间的差异的实现细节。

单击表单,两种方法显示它们在测量和渲染文本方面的差异。

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(Font.Height * lineSpacing)

    Dim flags As TextFormatFlags = TextFormatFlags.Top Or
                                   TextFormatFlags.WordBreak Or 
                                   TextFormatFlags.TextBoxControl

     Using g As Graphics = CreateGraphics()
         For x = 0 To sText.Length - 1
             Dim textSize As Size = TextRenderer.MeasureText(
                 g, sText(x), Font,
                 New Size(ClientSize.Width, ClientSize.Height), flags
             )

             TextRenderer.DrawText(g, sText(x), Font,
                 New Rectangle(0, relPositionY, textSize.Width, textSize.Height),
                 ForeColor, flags)
             relPositionY += textSize.Height + paragraphSpacing
         Next
     End Using
End Sub

在窗体的Paint()事件中,绘制sText线条,使用 .Graphics.MeasureString() 测量它们的宽度和高度,并使用.Graphics.DrawString()打印它们

请注意,TextRenderer 中的文本框大小是相对于 Form.ClientSize,而在 Graphics 中是相对于 Form 的完整宽度。

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(Font.Height) * lineSpacing

    Dim flags As StringFormatFlags = StringFormatFlags.LineLimit Or
                                     StringFormatFlags.FitBlackBox

    Using format As StringFormat = New StringFormat(flags)
        For x = 0 To sText.Length - 1
            Dim textSize As SizeF = e.Graphics.MeasureString(sText(x), Font,
                New SizeF(CSng(Width), CSng(Height)), format
            )
            e.Graphics.DrawString(sText(x), Font, Brushes.Black,
                New RectangleF(0, relPositionY, textSize.Width, textSize.Height))
            relPositionY += textSize.Height + paragraphSpacing
        Next
    End Using
End Sub
于 2018-01-10T16:13:06.090 回答