Непрямоугольное распределение двойной буферизации - PullRequest
0 голосов
/ 14 января 2011

Я рисую на панели в Windows.Forms.
Когда я использую двойную буферизацию, как здесь, я могу выделить только прямоугольную область.

А когда я рисую круг или эллипс, оставшееся пространство заполняется черным цветом.
Пожалуйста, помогите мне разобраться, что я делаю неправильно или как справиться с этой проблемой.
Заранее спасибо!:)

Я пытался this.DoubleBuffered = true, чтобы предотвратить мерцание.Это бесполезно.

Var p - это панель для рисования чего-либо на ней.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Dr(bool variant)
    {
        BufferedGraphicsContext currentContext;
        BufferedGraphics myBuffer;
        currentContext = BufferedGraphicsManager.Current;
        myBuffer = currentContext.Allocate(panel1.CreateGraphics(), panel1.DisplayRectangle);
        LinearGradientBrush lgb;
        if (variant) lgb = new LinearGradientBrush(new Point(0, 0), new Point(500, 500), Color.Red, Color.DarkRed);
        else lgb = new LinearGradientBrush(new Point(0, 0), new Point(500, 500), Color.DarkRed, Color.Red);
        myBuffer.Graphics.FillEllipse(lgb, 0, 0, 300, 300);
        myBuffer.Graphics.DrawString("Lorem ipsum", new Font("calibri", 40), Brushes.White, new PointF(50, 50));
        myBuffer.Render();
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Dr(true);
    }

    private void panel1_MouseEnter(object sender, EventArgs e)
    {
        Dr(false);
    }

    private void panel1_MouseLeave(object sender, EventArgs e)
    {
        Dr(true);
    }
}

1 Ответ

2 голосов
/ 14 января 2011

Не комментируя то, что вы пытаетесь сделать или что вы можете или не можете делать неправильно, основная проблема не мерцает. Двойная буферизация не поможет. Вы забыли заполнить любую часть панели, которую вы добавили в буфер, на котором вы не рисовали. Добавьте код, такой как:

Brush solidBrush = new SolidBrush(p.BackColor);
myBuffer.Graphics.FillRectangle(solidBrush, 0, 0, p.Width, p.Height);

Это заполнит весь прямоугольник оригинальным цветом задней панели.

Тем не менее, это решит вашу непосредственную проблему, но все равно может работать не так, как вы хотите. Попробуйте переместить окно поверх вашей формы. Как только панель должна по какой-либо причине перекрасить себя, то, что вы нарисовали, больше нет. Чтобы создать панель с постоянным рисунком, вам нужно будет создать собственный элемент управления, наследовать его от Panel и реализовать собственный чертеж в методе OnPaint элемента управления.

C # Элементы управления Winforms не являются действительно прозрачными, поэтому, если вы хотите прозрачный фон, вы должны создать свой собственный элемент управления. Техника описана здесь:

http://www.bobpowell.net/transcontrols.htm

...