拉绳部分粗体

时间:2012-07-26 08:00:24

标签: vb.net graphics treeviewitem drawstring

早上好。

我创建了一个自定义树视图控件,可以在屏幕上绘制正常的树视图,以及其他各种内容。在绘制事件期间,我使用以下方法将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(因为它是一个工作项目而且不是前面提到的,因此它是一个工作项目,这就是软件设计的环境)

2 个答案:

答案 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.DrawTextGraphics.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获得。