底層重繪每次會清除畫布,然后再全部重新繪制,這是導致閃爍最主要的原因。於是重載消息發送函數操作,禁掉這條消息。
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0014) // 禁掉清除背景消息
return;
base.WndProc(ref m);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
public static void SetDoubleBuffered(object obj)
{
Type type = obj.GetType();
PropertyInfo pi = type.GetProperty("DoubleBuffered",
BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(obj, true, null);
}