在 Windows Forms 应用程序中,在 Form 上添加多个控件时,通常会发生短暂的屏幕闪烁或重绘。
要最小化或消除闪烁,可以在添加控件或进行其他UI变更之前,暂时禁用 Form 的重绘,并在添加完所有控件后再启用重绘。
可以通过在 Windows API 中使用 SendMessage 函数和特定的消息来实现,尤其是 WM_SETREDRAW 消息。
WM_SETREDRAW 消息允许您暂时禁用 (wParam 为 0)或启用 (wParam 为 1)指定窗口的更新。
示例代码如下:
public class Form1 : Form
{
public void OpenForm2()
{
Form2 form2 = new Form2();
form2.AddControlsWithoutFlicker();
form2.Show();
}
}
public class Form2 : Form
{
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);
private const int WM_SETREDRAW = 11;
public Form2()
{
// ...
}
public void AddControlsWithoutFlicker()
{
// 禁用绘图更新
SendMessage(this.Handle, WM_SETREDRAW, false, 0);
// ...
// 重新启用绘图更新
SendMessage(this.Handle, WM_SETREDRAW, true, 0);
// 重绘表单及其所有子控件
this.Refresh();
}
}