将抽绳部分加粗



早上好。

我创建了一个自定义树视图控件,它在屏幕上绘制一个普通的树视图,以及其他各种东西。在绘制事件期间,我使用以下方法将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.DrawTextGraphics.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;
    }
}

从这里获得。

相关内容

  • 没有找到相关文章

最新更新