1

重複の可能性:
コントロールとその子のペイントを一時停止するにはどうすればよいですか?

フォームに数百のコントロールを追加していますが、各コントロールが追加されるまでフォームがちらつきますが、これを停止する方法はありますか?

4

3 に答える 3

4

答えは、この質問に対する答えと同じです。

コントロールとその子のペイントを一時停止するにはどうすればよいですか?

(便宜上コピーされた回答:元々はhttps://stackoverflow.com/users/36860/ng5000から)

以前の仕事では、リッチUIアプリを即座にスムーズにペイントするのに苦労しました。標準の.Netコントロール、カスタムコントロール、およびdevexpressコントロールを使用していました。

グーグルとリフレクターを何度も使用した後、WM_SETREDRAWwin32メッセージに出くわしました。これにより、コントロールを更新している間、コントロールの描画が実際に停止し、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();
    }
}

これについてはもっと完全な議論があります-GoogleforC#とWM_SETREDRAW、例えば

C#ジッター

レイアウトの一時停止

于 2010-01-15T18:20:43.590 に答える
2

フォームのSuspendLayoutプロパティとResumeLayoutプロパティでコードを囲むことができます

this.SuspendLayout();

//コントロールを作成します

this.ResumeLayout(true);

于 2010-01-15T18:17:30.263 に答える
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();
    }
}
于 2011-06-10T04:39:53.947 に答える