早上好。
我创建了一个自定义树视图控件,可以在屏幕上绘制正常的树视图,以及其他各种内容。在绘制事件期间,我使用以下方法将node.text字符串绘制到树视图控件。
node.text = "ABCDEFG"
g.DrawString(node.Text, tvFont, Brushes.Black, strPosX + 10, bothPosY)
基本上我要做的是将node.text的一部分设为斜体,以便它在屏幕上呈现如此......
AB*CDE*FG
就我个人而言,我会以这样的方式处理它:它有效地绘制了三个不同的字符串......两个非斜体和一个斜体,但这需要额外的定位。
我希望能够有效地连接字体格式化字符串,然后将其作为抽象字符串中的第一个参数,这实际上是否可行?如果是这样我将如何去做和/或有任何资源可以帮助我。
我正在使用winforms和visualbasic .net框架3.5(因为它是一个工作项目而且不是前面提到的,因此它是一个工作项目,这就是软件设计的环境)
答案 0 :(得分:2)
我希望能够有效地连接字体格式字符串,然后将其作为抽象字符串中的第一个参数,这实际上是否可行?
不,这是不可能的。 DrawString
函数将使用您指定的格式标记绘制您指定的所有文本。这是一个全有或全无的事情。
如果您想将某些部分设为粗体而其他部分不是,则需要多次调用DrawString
函数。为实现这一目标还有一些额外的定位,但这不应该太困难。只有x坐标在变化; y坐标应该保持不变。除非你做一些像改变 font faces 这样的事情,否则your baselines will get messed up and you will have to compensate for that to prevent the result from looking like an ugly mismatch。
除此之外,请允许我建议您使用TextRenderer.DrawText
function而不是Graphics.DrawString
功能。前者的优点是它使用GDI绘制文本,这与内置本机控件绘制文本的方式相同。这种一致性有许多优点,其中最重要的是令人愉悦和谐的视觉外观。
如果您使用的是TextRenderer.DrawText
,那么您还需要确保将其与TextRenderer.MeasureText
结合使用,因为测量值与Graphics.MeasureString
返回的值不同,使用GDI +绘制。
this question的答案中提供了有关TextRenderer.DrawText
和Graphics.DrawString
之间差异的更多信息。 Graphics.DrawString
应保留用于打印,TextRenderer.DrawText
应用于所有屏幕元素。
答案 1 :(得分:2)
如下:
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;
}
}
从here获得。