Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在vb.net中用TextRenderer DrawText包装长单词_Vb.net_Word Wrap_Drawtext_Word Break_Textrenderer - Fatal编程技术网

如何在vb.net中用TextRenderer DrawText包装长单词

如何在vb.net中用TextRenderer DrawText包装长单词,vb.net,word-wrap,drawtext,word-break,textrenderer,Vb.net,Word Wrap,Drawtext,Word Break,Textrenderer,如何使用vb.net中的TextRenderer DrawText()在窗体上绘制一个长单词,并将其打断?我认为这是一个简单的问题,我尝试了所有的TextFormatFlags组合,但我找不到任何解决方案。 有人能帮忙吗? 以下是一个示例: sText = "C:\Users\abiga\OneDrive\Works\AdreNDSzinkron\bin\Debug\AdreService.exe" TextRenderer.DrawText(e.Graphics, sText, Font, N

如何使用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
C:\Users\abiga\OneDrive\Works\...
C:\Users\ab...bug\AdreService.exe

谢谢你的帮助

首先尝试将
TextFormatFlags.WordBreak或TextFormatFlags.TextBoxControl
作为您的标志

文件说:

分词:在一个词的末尾分词

TextBoxControl:指定文本应格式化以在TextBox控件上显示

组合这些标志应该会得到预期的结果

如果不起作用,请尝试使用:


e.Graphics.DrawString(sText,Font,Me.Color,New RectangleF(0,0,Me.Width,Me.Height))
只是为了添加一些实现细节,可以用来评估
.DrawString()方法和.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
行,使用测量行的宽度和高度,并使用


在表单的
Paint()
事件中,绘制
sText
行,使用测量行的宽度和高度,并使用

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


TextFormatFlags.WordBreak或TextFormatFlags.TextBoxControl
@Jimi-TexBoxControl是键。没有它,分词符只是在空格处换行,但没有“分词”。谢谢你的解决方案!我会相应地编辑我的答案,很高兴它被分类:)哇。非常详细的回答,不知道这些区别。@一位朋友,图形方法使用旧的GDI+API,而TextReder方法使用新的ish GDI API。当您在
OnPaint()
事件中使用
e.Graphics
时,可能无法按预期工作,因为项目通常使用
应用程序初始化。SetCompatibleTextRenderingDefault(False)
(其中“True”表示“使用GDI+”),因此Windows.Forms控件将使用GDI而不是GDI+进行渲染。哦,我知道,我是指区块报价中的那一点,但谢谢:)
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"
  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
  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