2010-01-15 20 views

回答

4

答案是一樣的回答了這個問題:

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,例如

C# Jitter

Suspending Layouts

2

可能要與周圍的形式

this.SuspendLayout()的SuspendLayout和ResumeLayout屬性代碼;

//創建控件

this.ResumeLayout(真);

2

以下是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(); 
    } 
}