Reputation: 5966
Is there any way to disable the erasing of a panel without subclassing Panel and overriding OnPaintBackground?
I am trying to achieve a double buffering effect without subclassing Panel. I understand that this may be a weird thing to try to do, but I'd at least like to know if I can or not. The following code sample illustrates this:
public partial class Form1 : Form
{
private Bitmap m_image;
public Form1()
{
InitializeComponent();
panel1.Paint += new PaintEventHandler(panel1_Paint);
panel1.MouseMove += new MouseEventHandler(panel1_MouseMove);
m_image = new Bitmap(panel1.Width, panel1.Height);
}
void panel1_MouseMove(object sender, MouseEventArgs e)
{
using (Graphics g = Graphics.FromImage(m_image))
{
g.FillEllipse(Brushes.Black, new Rectangle(e.X, e.Y, 10, 10));
}
panel1.Invalidate();
}
void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(m_image, 0, 0);
}
}
This causes a flickering, presumably because it is erasing the panel at each paint cycle.
Upvotes: 3
Views: 1027
Reputation: 21
Use reflection to the set the protected DoubleBuffered property:
System.Reflection.PropertyInfo aProp =
typeof(System.Windows.Forms.Control).GetProperty(
"DoubleBuffered",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
aProp.SetValue(panel1, true, null);
You can also make it more efficient by only invalidating the changed area (this is almost flicker-free even without the double-buffering):
void panel1_MouseMove(object sender, MouseEventArgs e)
{
Rectangle r = new Rectangle(e.X, e.Y, 10, 10);
using (Graphics g = Graphics.FromImage(m_image))
{
g.FillEllipse(Brushes.Black, r);
}
panel1.Invalidate(r);
}
Upvotes: 0
Reputation: 5831
Just add:
panel1.BackgroundImage = m_image;
//on panel1_Paint() function.
Simple isn't it?
Upvotes: 0
Reputation: 941625
You can hack OnPaintBackground() or you can hack WndProc(). Either requires deriving your own class. It's trivial, I just don't see why you'd avoid it. The long distance shot is SetWindowsHookEx() with a WH_CALLWNDPROC hook, too silly really.
Upvotes: 4