gpt4 book ai didi

c# - 如何使用 GDI 为多行文本的某些部分添加下划线?

转载 作者:行者123 更新时间:2023-11-30 16:35:39 27 4
gpt4 key购买 nike

我正在使用 Graphics.DrawString 来绘制我的用户控件的文本,如下所示:

protected override void OnPaint(PaintEventArgs e)
{
RectangleF bounds = DisplayRectangle;
bounds.Inflate(-4, -4); // Padding
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Near;
format.LineAlignment = StringAlignment.Near;
format.Trimming = StringTrimming.None;
using (Brush bFore = new SolidBrush(ForeColor))
{
g.DrawString(Text, Font, bFore, bounds, format);
}
}

如果控件的 TextDisplayRectangle 宽,DrawString 会很好地将 Text 分成多行界限。

现在我想给 Text 中的一些单词加下划线,但我做不到。我尝试拆分 Text,然后是 MeasureString 下划线部分开始之前的字符串,DrawString 正常部分,然后是 DrawString下划线部分。但这仅在 Text 是单行的情况下有效。

我确信使用子控件 LinkLabelRichTextBox 来呈现我的控件的文本会解决这个问题,但我不喜欢使用子控件只是为了划几个字。还有别的办法吗?

最佳答案

这是一个粗略的示例,可以使用拆分成多个部分的字符串和两种不同的字体样式,而不是单独绘制下划线(尽管那样也可以)。在实际实践中,我会建议按单词而不是短语拆分文本,并在循环中单独处理每个单词。否则,就像在这个例子中一样,换行不能正常工作。

Dim fntNormal As New Font(myFontFamily, myFontSize, FontStyle.Regular, GraphicsUnit.Pixel)
Dim fntUnderline As New Font(myFontFamily, myFontSize, FontStyle.Underline, GraphicsUnit.Pixel)

g.DrawString("This is ", fntNormal, Brushes.Black, rctTextArea)
w1 = g.MeasureString("This is ", fntNormal).Width
w2 = g.MeasureString("underlined", fntUnderline).Width
If w1 + w2 > rctTextArea.Width Then
yPos = rctTextArea.Y + g.MeasureString("This is ", fntNormal).Height + 5
xPos = rctTextArea.X
Else
yPos = rctTextArea.Y
xPos = 0
End If

g.DrawString("underlined", fntUnderline, Brushes.Black, xPos, yPos)

w1 = g.MeasureString("underlined", fntUnderline).Width
w2 = g.MeasureString(", and this is not.", fntNormal).Width

If w1 + w2 > rctTextArea.Width Then
yPos += g.MeasureString("underlined", fntUnderline).Height + 5
xPos = rctTextArea.X
Else
xPos = 0
End If


g.DrawString(", and this is not.", fntNormal, Brushes.Black, xPos, yPos)

这段代码确实可以被清理并提高效率,让您循环遍历文本字符串中的每个单词。

此示例也不包含任何代码来检查您是否超出了边界矩形的垂直限制。

抱歉,关于 VB 代码,我刚刚注意到你的问题是用 C# 编写的。

关于c# - 如何使用 GDI 为多行文本的某些部分添加下划线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1650357/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com