4

早上好。

我创建了一个自定义的树视图控件,它可以在屏幕上绘制一个普通的树视图,以及其他各种东西。在绘制事件期间,我使用以下方法将 node.text 字符串绘制到树视图控件。

node.text = "ABCDEFG"
g.DrawString(node.Text, tvFont, Brushes.Black, strPosX + 10, bothPosY)

基本上我想要做的是使 node.text 斜体的一部分,以便它像这样呈现在屏幕上......

AB*CDE*FG

就我个人而言,我会以这样一种方式来处理它,它可以有效地绘制三个不同的字符串......两个非斜体和一个斜体,但这需要额外的定位。

我希望可以有效地连接字体格式的字符串,然后将其作为drawstring中的第一个参数,这真的可能吗?如果是这样,我将如何去做和/或是否有任何资源可以帮助我。

我正在使用winforms和visualbasic .net framework 3.5(不幸的是,上述内容不能更改,因为它是一个工作项目,这是软件设计的环境)

4

2 回答 2

3

我希望可以有效地连接字体格式的字符串,然后将其作为drawstring中的第一个参数,这真的可能吗?

不,这是不可能的。该DrawString函数将使用您指定的格式标志绘制您指定的所有文本。这是一个全有或全无的事情。

如果您想让某些部分加粗而其他部分不加粗,则需要多次调用该DrawString函数。实现这一点需要一些额外的定位,但这应该不会太难。只有 x 坐标在变化;y 坐标应保持不变。除非你做一些花哨的事情,比如改变字体,否则你的基线会被弄乱,你必须补偿它以防止结果看起来像一个丑陋的不匹配


除此之外,请允许我建议您改用 [`TextRenderer.DrawText` 函数](https://docs.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.DrawStringTextRenderer.DrawText

于 2012-07-26T14:46:17.777 回答
3

怎么样:

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;
    }
}

这里获得。

于 2013-07-04T23:17:17.417 回答