2011-01-14 44 views
0

我在Windows.Forms的Panel上画图。
当我在这里使用双缓冲时,我只能分配矩形区域。双缓冲非矩形分配

而当我画圆或椭圆时,剩下的空间充满了黑色。
请帮我弄清楚我做错了什么或如何解决这个问题。
在此先感谢! :)

我试过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); 
    } 
} 

回答

2

没有评论你正在尝试做什么或者你可能做什么或可能做什么不可能在这里做错,基本问题不是闪烁。双缓冲将无济于事。你忽略了填写你添加到你没有绘制的缓冲区的任何部分。添加代码如:

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

这将填充整个矩形与面板的原始背色。

但是,这将解决您的直接问题,但它仍然可能无法正常工作。尝试在窗体上移动窗口。只要面板因任何原因必须重新绘制,您绘制的内容就会消失。要制作具有持久性绘图的面板,您必须创建自己的控件,从面板继承,并在控件的OnPaint方法中实现自定义绘图。

C#Winforms控件不是真正透明的,所以如果你想要透明背景,你必须创建自己的控件。这里描述的技术:

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

+0

但如果我想要透明背景色,因为我是用表格的背景图像模式? – 2011-01-14 13:10:20