如何在vb.net中用TextRenderer DrawText包装长单词
如何使用vb.net中的TextRenderer DrawText()在窗体上绘制一个长单词,并将其打断?我认为这是一个简单的问题,我尝试了所有的TextFormatFlags组合,但我找不到任何解决方案。 有人能帮忙吗? 以下是一个示例:如何在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
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