Переопределение OnPaint не может рисовать белый текст поверх графических блоков - PullRequest
0 голосов
/ 15 февраля 2011

Я пишу приложение, которое редактирует метаданные песен. Для этого у меня есть окно, в котором были выбраны метки песни, и вы можете выбирать между старым и новым. У меня есть пользовательский элемент управления с 3 картинками для каждого тега. Одна графическая коробка для левой крышки, одна для средней и одна для правой крышки. Затем я переписал OnPaint для UserControl, чтобы нарисовать текст в элементе управления. Это работает хорошо, за исключением случаев, когда я пытаюсь использовать белый текст поверх графического блока, в котором есть изображение. Белый кажется полупрозрачным. Я приложил фотографии ниже, демонстрирующие это.

Черный текст

Изображение черного текста http://bentrengrove.com.au/blackText.PNG

Белый текст

Изображение белого текста 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 ]

1 голос
/ 15 февраля 2011

Я решил эту проблему сам.Проблема заключается в том, что заказанные элементы расписаны на форме.Поскольку я рисовал над картинкой в ​​методе управления OnPaint, сначала вызывается OnPaint.Даже если base.OnPaint является первым элементом в моем методе onPaint, рисование элементов управления окрашивается после завершения этого метода.При удалении среднего поля изображения и раскрашивании его изображения внутри OnPaint текст отображается белым цветом.Я все еще не уверен, почему эта проблема появляется только на белом тексте и не возникает на других цветах.

0 голосов
/ 15 февраля 2011

Вы абсолютно уверены, что кисть, которую вы в конечном итоге используете, белая? Можете ли вы проверить, что _isSelected и this.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,
            });
    }
}
...