双缓冲非矩形分配

时间:2011-01-14 12:20:17

标签: c# memory-management doublebuffered

我在Windows.Forms中绘制了Panel 当我像这里一样使用双缓冲时,我只能分配矩形区域。

当我绘制圆形或椭圆形时,剩余空间充满黑色 请帮我弄清楚我做错了什么或如何解决这个问题 提前致谢! :)

我尝试this.DoubleBuffered = true以防止闪烁。没用。

Var p是Panel,可以在上面绘制内容。

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 个答案:

答案 0 :(得分:2)

如果没有评论你想要做什么,或者你可能会或可能不会在这里做错,那么基本问题就不是闪烁。双缓冲无济于事。您已忽略填写您添加到未绘制的缓冲区的面板的任何部分。添加代码如:

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