可能重複:
How do I suspend painting for a control and its children?的WinForms等待繪製直到控件添加
我增加了幾百控件到窗體和形式閃爍,直到它完成,因爲它增加了每個控件,無論如何要阻止這個?
可能重複:
How do I suspend painting for a control and its children?的WinForms等待繪製直到控件添加
我增加了幾百控件到窗體和形式閃爍,直到它完成,因爲它增加了每個控件,無論如何要阻止這個?
答案是一樣的回答了這個問題:
How do I suspend painting for a control and its children?
(答案複製的方便:最初來自:https://stackoverflow.com/users/36860/ng5000)
在我以前的工作,我們有讓我們豐富的掙扎UI應用程序即時和平滑地繪製。我們使用標準的.Net控件,自定義控件和devexpress控件。
經過大量的谷歌搜索和反射器使用,我遇到了WM_SETREDRAW win32消息。這確實會停止控制繪圖,同時更新它們,並且可以將IIRC應用到父/包含面板。
這是一個非常非常簡單的類演示如何使用此消息:
class DrawingControl
{
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
private const int WM_SETREDRAW = 11;
public static void SuspendDrawing(Control parent)
{
SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
}
public static void ResumeDrawing(Control parent)
{
SendMessage(parent.Handle, WM_SETREDRAW, true, 0);
parent.Refresh();
}
}
有這個更充分的討論 - 谷歌爲C#和WM_SETREDRAW,例如
可能要與周圍的形式
this.SuspendLayout()的SuspendLayout和ResumeLayout屬性代碼;
//創建控件
this.ResumeLayout(真);
以下是ng5000相同的溶液,但不使用的P/Invoke。
public static class SuspendUpdate
{
private const int WM_SETREDRAW = 0x000B;
public static void Suspend(Control control)
{
Message msgSuspendUpdate = Message.Create(control.Handle, WM_SETREDRAW, IntPtr.Zero,
IntPtr.Zero);
NativeWindow window = NativeWindow.FromHandle(control.Handle);
window.DefWndProc(ref msgSuspendUpdate);
}
public static void Resume(Control control)
{
// Create a C "true" boolean as an IntPtr
IntPtr wparam = new IntPtr(1);
Message msgResumeUpdate = Message.Create(control.Handle, WM_SETREDRAW, wparam,
IntPtr.Zero);
NativeWindow window = NativeWindow.FromHandle(control.Handle);
window.DefWndProc(ref msgResumeUpdate);
control.Invalidate();
}
}
無論您做什麼,帶有數百個控件的窗體都會像廉價汽車旅館一樣閃爍。將它們添加到面板,然後添加面板並不能真正解決任何問題。 – 2010-01-15 18:21:50