C# 我怎样才能在面板上画画,使它不会闪烁?
这是我的密码。当我把光标移到表格上时,圆圈在移动,但它在闪烁。我怎样才能解决这个问题C# 我怎样才能在面板上画画,使它不会闪烁?,c#,winforms,visual-studio-2010,drawing,panel,C#,Winforms,Visual Studio 2010,Drawing,Panel,这是我的密码。当我把光标移到表格上时,圆圈在移动,但它在闪烁。我怎样才能解决这个问题 public partial class Preprocesor : Form { int x, y; Graphics g; public Preprocesor() { InitializeComponent(); } private void Preprocesor_Load(object sender, EventArgs e)
public partial class Preprocesor : Form
{
int x, y;
Graphics g;
public Preprocesor()
{
InitializeComponent();
}
private void Preprocesor_Load(object sender, EventArgs e)
{
g = pnlMesh.CreateGraphics();
}
private void pnlMesh_Paint(object sender, PaintEventArgs e)
{
g.Clear(Color.White);
g.FillEllipse(Brushes.Black, x, y, 10, 10);
}
private void pnlMesh_MouseMove(object sender, MouseEventArgs e)
{
x = e.X;
y = e.Y;
pnlMesh.Invalidate();
}
}
您需要使用双缓冲控件 创建一个继承
控件
并在构造函数中设置的类(这是受保护的属性)。使用该控件而不是您的面板,这样不会有任何闪烁 此外,您不应为以后存储
图形对象。
相反,您应该在绘制
处理程序中绘制e.Graphics
。覆盖面板用户控件并将双缓冲
设置为true怎么样
public partial class BufferPanel : Panel
{
public BufferPanel()
{
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
UpdateStyles();
}
}
塔克斯。行得通:)。除了我制作了继承面板的控件
@Ichibann:除非你也在里面放置控件,否则你不应该使用面板;它只是增加了开销。+1只是一个小注释-在使用这个双缓冲区之前,我每次都会处理e.Graphics
对象,这没有引起任何问题,但是当双缓冲区设置为true时,它导致没有绘制任何内容。删除了dispose,所有操作都像一个符咒。@ShadowWizard:除非文档告诉您,否则您不应该处理属于其他人的对象。@SLaks我不知道在编写原始代码时,直到您说了才确定,总是担心在幕后它会返回必须处理的新图形对象。可能是由于我的SharePoint背景-无论如何,感谢您的澄清。它是BufferPanel
类,但具有TransparentPanel
构造函数:p您为什么需要在此处创建图形
?PaintEventArgs已经提供了图形方法。