フォームに数百のコントロールを追加していますが、各コントロールが追加されるまでフォームがちらつきますが、これを停止する方法はありますか?
3 に答える
答えは、この質問に対する答えと同じです。
コントロールとその子のペイントを一時停止するにはどうすればよいですか?
(便宜上コピーされた回答:元々は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、例えば
フォームのSuspendLayoutプロパティとResumeLayoutプロパティでコードを囲むことができます
this.SuspendLayout();
//コントロールを作成します
this.ResumeLayout(true);
以下は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();
}
}