0

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

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

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

1 回答 1

2

如果不评论您正在尝试做的事情或您可能会或可能不会做错的事情,那么基本问题不是闪烁。双缓冲无济于事。您忽略了填充您添加到缓冲区中的面板的任何部分,但您没有在上面绘制。添加代码如:

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

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

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

C# Winforms 控件并不是真正透明的,因此如果您想要透明背景,您必须创建自己的控件。此处描述了该技术:

https://web.archive.org/web/20141227200000/http://bobpowell.net/transcontrols.aspx

于 2011-01-14T13:05:50.267 回答