OnPaint覆盖无法在图片框顶部绘制白色文本

时间:2011-02-14 22:40:02

标签: c# winforms windows-7 gdi+

我正在编写一个编辑歌曲元数据的应用程序。要做到这一点,我有一个选择了歌曲标签的窗口,你可以选择旧的和新的。我有一个自定义控件,每个标签框中有3个图片框。左帽有一个图片框,一个用于中间,一个用于右帽。然后我覆盖了OnPaint,UserControl将文本绘制到控件上。这工作正常,除非我尝试在其中包含图像的图片框顶部使用白色文本。白色似乎变得半透明。我在下面附上照片来证明这一点。

黑色文字

Image of Black Text http://bentrengrove.com.au/blackText.PNG

白色文字

Image of White Text http://bentrengrove.com.au/WhiteText.PNG

以下是我的OnPaint方法的代码

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    Graphics g = e.Graphics;
    Brush b;
    Font f;

    if (_isSelected && this.Enabled) //Determines if the tag has the boxes visible, i.e is a selected tag
    {
        b = new SolidBrush(Color.White);
        f = new System.Drawing.Font("Segoe UI", 8, FontStyle.Regular);
    }
    else
    {
        b = new SolidBrush(Color.Gray);
        f = new System.Drawing.Font("Segoe UI", 8, FontStyle.Regular);
    }

    var textSize = g.MeasureString(_text, f); //We will resize the tag boxes based on the size of the text
    StringFormat drawFormat = new StringFormat();
    drawFormat.Alignment = StringAlignment.Near;

    RectangleF layoutRectangle = new RectangleF(leftCap.Width, 1, textSize.Width, 16);

    if (textSize.Width >= 105)
        _text = String.Format("{0}...", _text.Substring(0, 15)); //There is only so much room to display text

    middle.Width = (int)textSize.Width + rightCap.Width;
    rightCap.Left = middle.Left + middle.Width - rightCap.Width;

    g.DrawString(_text, f, b, layoutRectangle, drawFormat); //Draw the string for this control based on what has been set to text

    //Clean up
    g.Dispose();
    b.Dispose();
    f.Dispose();
}

如果有人有任何想法我为什么不能用白色绘画,请帮助我们。非常感谢。

2 个答案:

答案 0 :(得分:1)

我自己解决了这个问题。问题是由于订单项在表单上绘制。因为我在控件OnPaint方法中绘制了一个图片框,所以首先调用OnPaint。即使base.OnPaint是我的onPaint方法中的第一个项目,也会在此方法完成后绘制控件的绘制。通过删除中间图片框并在OnPaint中绘制其图像,文本正确绘制白色。我仍然不确定为什么这个问题只出现在白色文本上,而不会出现在其他颜色上。

答案 1 :(得分:0)

你绝对确定你最终使用的画笔是白色的吗?您可以验证_isSelectedthis.Enabled都是true吗?检查调试器以查看值。

我在Gray背景上添加了一些DimGray文字,它看起来与现在的情况类似。

sample

protected override void OnPaint(PaintEventArgs pe)
{
    using (Font f = new Font(this.Font.FontFamily, 8f, FontStyle.Regular))
    {
        pe.Graphics.DrawString(
            "Foo",
            f,
            Brushes.Black,
            new PointF(5, 5),
            new StringFormat
            {
                Alignment = StringAlignment.Near,
            });
        pe.Graphics.DrawString(
            "Bar",
            f,
            Brushes.Gray,
            new PointF(5, 20),
            new StringFormat
            {
                Alignment = StringAlignment.Near,
            });
        pe.Graphics.DrawString(
            "Bar",
            f,
            Brushes.White,
            new PointF(5, 35),
            new StringFormat
            {
                Alignment = StringAlignment.Near,
            });
    }
}