早上好。
我创建了一个自定义树视图控件,它在屏幕上绘制一个普通的树视图,以及其他各种东西。在绘制事件期间,我使用以下方法将node.text字符串绘制到树视图控件。
node.text = "ABCDEFG"
g.DrawString(node.Text, tvFont, Brushes.Black, strPosX + 10, bothPosY)
基本上,我想做的是将node.text的一部分变成斜体,这样它就可以在屏幕上呈现为…
AB*CDE*FG
就我个人而言,我会以这样一种方式来处理这个问题,即它有效地画出三条不同的线。。。两个非斜体和一个斜体,但是这需要额外的定位。
我希望可以有效地连接字体格式的字符串,然后将其作为drawstring中的第一个参数,这真的可能吗?如果是这样的话,我该怎么做?和/或有什么资源可以帮助我。
我使用的是winforms和visualbasic.net框架3.5(不幸的是,上述内容都不能更改,因为这是一个工作项目,这是软件设计的环境)
我希望可以有效地连接字体格式的字符串,然后将其作为drawstring中的第一个参数,这真的可能吗?
不,这是不可能的。DrawString
函数将使用指定的格式标志绘制指定的所有文本。这是一件要么全有要么全无的事情。
如果要将某些部分加粗,而不将其他部分加粗,则需要多次调用DrawString
函数。要做到这一点,还需要一些额外的定位,但这应该不会太难。只有x坐标在变化;y坐标应保持不变。除非你做了一些花哨的事情,比如更改字体,否则你的基线会变得一团糟,你必须对此进行补偿,以防止结果看起来像是丑陋的不匹配。
除此之外,请允许我建议您使用[`TextRenderer.DrawText`函数](https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.textrenderer.drawtext)而不是"Graphics.DrawString"函数。前者的优点是它使用GDI绘制文本,这与内置的本机控件绘制文本的方式相同。这种一致性有很多优点,尤其是令人愉悦和和谐的视觉外观。
如果您使用的是TextRenderer.DrawText
,您还需要确保将其与TextRenderer.MeasureText
相结合,因为测量值与Graphics.MeasureString
返回的测量值不同,后者使用GDI+绘制。
关于TextRenderer.DrawText
和Graphics.DrawString
之间差异的更多信息,请参阅此问题的答案。Graphics.DrawString
应保留用于打印,TextRenderer.DrawText
应用于所有屏幕元素。
像这样的东西怎么样
private void Form1_Paint(object sender, PaintEventArgs e)
{
using (Font normal = new Font("Tahoma", 10, FontStyle.Regular))
using (Font bold = new Font("Tahoma", 10, FontStyle.Bold))
using (StringFormat format =
(StringFormat)StringFormat.GenericTypographic.Clone())
{
format.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
Rectangle temp = ClientRectangle;
DrawString(e.Graphics, SystemBrushes.WindowText, ref temp, format, "AB", normal);
DrawString(e.Graphics, SystemBrushes.WindowText, ref temp, format, "CDE ", bold);
DrawString(e.Graphics, SystemBrushes.WindowText, ref temp, format, "FG", normal);
}
}
void DrawString(Graphics g, Brush brush, ref Rectangle rect, StringFormat format, string text, Font font)
{
using (StringFormat copy = (StringFormat)format.Clone())
{
copy.SetMeasurableCharacterRanges(new CharacterRange[] {
new CharacterRange(0, text.Length)});
Region[] regions = g.MeasureCharacterRanges(text, font, rect, copy);
g.DrawString(text, font, brush, rect, format);
int width = (int)(regions[0].GetBounds(g).Width);
rect.X += width;
rect.Width -= width;
}
}
从这里获得。