WinForms мерцает после максимизации - двойная буферизация - PullRequest
0 голосов
/ 18 января 2019

У меня есть «Основная» форма с кнопками навигации слева и панель справа, которую я использую в качестве держателя для дочерних форм. Это довольно просто, но код этого ниже.

public void showForm(Form form)
{
    // Disposed Prior Form & Load New
    form.Dock = DockStyle.Fill;
    form.TopLevel = false;
    pnlMain.Controls.Clear();
    pnlMain.Controls.Add(form);
    form.Show();
}

Основная проблема, с которой я сталкиваюсь, заключается в том, что все работает нормально, я практически не мерцаю, используя приведенный ниже код при переходе от формы к форме, но как только я максимизирую свою «основную» форму (которая, в свою очередь, увеличивает « Дочерняя форма) ... даже если я разверну и вернусь к исходному размеру, он начнет мерцать как сумасшедший, когда я перейду к новой форме. Это как если бы после максимизации он полностью игнорировал код, введенный для исправления мерцания. Я должен также упомянуть, что у «дочерней» формы есть свое собственное событие рисования формы, поэтому у меня есть эти вещи, чтобы уменьшить мерцание, обычно это не проблема до максимизации.

public void drawBackgroundChild(PaintEventArgs e, Form form)
{
   // prevents error on resize
   if (form.ClientRectangle.Width == 0 || form.ClientRectangle.Height == 0)
       return;

   using (LinearGradientBrush brush = new LinearGradientBrush(form.ClientRectangle,
                                                                     UserSettings.secondaryColor1,
                                                                      UserSettings.secondaryColor2,
                                                                      90F))
            {
                e.Graphics.FillRectangle(brush, form.ClientRectangle);
            }
}



protected override CreateParams CreateParams
{
    get
    {
        var cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;    // Turn on WS_EX_COMPOSITED
        return cp;
    }
}

Я несколько раз пробовал код, указанный выше, а также код, указанный ниже, в формах «Master» и «Child». Протестировал кучу разных способов, но не повезло. Кто-нибудь знает, отключает ли изменение формы Windows двойную буферизацию или что-то в этом роде?

 DoubleBuffered = true;
 this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);

1 Ответ

0 голосов
/ 18 января 2019

Пришлось удалить любые виды двойной буферизации / createparams и т. Д. Из главной формы и поместить их исключительно в дочерние формы ....

protected override CreateParams CreateParams
{
    get
       {
         var cp = base.CreateParams;
         cp.ExStyle |= 0x02000000;    // Turn on WS_EX_COMPOSITED
         return cp;
       }
}


frmChild()
{
    ResizeRedraw = true;
    this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer |
                  ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);
}
...