Я знаю, что этот вопрос немного старый, но лучше поздно, чем никогда.Я использовал ваш исходный пример, который вы связали, чтобы придумать тот, который включает его при изменении размера, а затем переключает его обратно, чтобы нарисовать все остальное идеально.Надеюсь, это поможет другим, ищущим решение этой проблемы.Как известно оператору, только свойства DoubleBuffering не решают проблемы мерцания.
Вот обходной путь, чтобы остановить мерцание, когда пользователь изменяет размеры формы, но без путаницы при рисовании элементов управления, таких как DataGridView, NumericUpDown,и т. д. При условии, что ваша форма называется "Form1":
int intOriginalExStyle = -1;
bool bEnableAntiFlicker = true;
public Form1()
{
ToggleAntiFlicker(false);
InitializeComponent();
this.ResizeBegin += new EventHandler(Form1_ResizeBegin);
this.ResizeEnd += new EventHandler(Form1_ResizeEnd);
}
protected override CreateParams CreateParams
{
get
{
if (intOriginalExStyle == -1)
{
intOriginalExStyle = base.CreateParams.ExStyle;
}
CreateParams cp = base.CreateParams;
if (bEnableAntiFlicker)
{
cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED
}
else
{
cp.ExStyle = intOriginalExStyle;
}
return cp;
}
}
private void Form1_ResizeBegin(object sender, EventArgs e)
{
ToggleAntiFlicker(true);
}
private void Form1_ResizeEnd(object sender, EventArgs e)
{
ToggleAntiFlicker(false);
}
private void ToggleAntiFlicker(bool Enable)
{
bEnableAntiFlicker = Enable;
//hacky, but works
this.MaximizeBox = true;
}