我在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);
}
}
答案 0 :(得分:2)
如果没有评论你想要做什么,或者你可能会或可能不会在这里做错,那么基本问题就不是闪烁。双缓冲无济于事。您已忽略填写您添加到未绘制的缓冲区的面板的任何部分。添加代码如:
Brush solidBrush = new SolidBrush(p.BackColor);
myBuffer.Graphics.FillRectangle(solidBrush, 0, 0, p.Width, p.Height);
这将使整个矩形填充面板的原始背景颜色。
然而,这将解决您的直接问题,但它仍然可能无法正常工作。尝试在窗体上移动窗口。一旦专家组因任何原因不得不重新粉刷,你所画的就不见了。要创建一个带有持久绘图的面板,您必须创建自己的控件,从Panel继承,并在控件的OnPaint方法中实现自定义绘图。
C#Winforms控件不是真正透明的,所以如果你想要一个透明的背景,你必须创建自己的控件。这里介绍了这种技术: