Вопрос

У меня есть форма, и у меня есть тона других элементов управления (кнопки, пользовательские элементы управления, метки, панель, Gridview). Вы можете догадаться, что у меня была проблема мерцания. Я попробовал двойной буферинг, и это не могло решить. Наконец я попробовал это:

protected override CreateParams CreateParams
{
    get
    {
        // Activate double buffering at the form level.  All child controls will be double buffered as well.
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;   // WS_EX_COMPOSITED
        return cp;
    }
} 

Мерцание исчезло, но мой DataGridView делает неправильно. Это показывает сотовые ракурды, пограничные корпусы неправильны. На самом деле этот код имеет некоторую проблему с фоновыми изображениями, линиями и другими вещами. Почему это и как это может быть исправлено?

Это было полезно?

Решение

Я знаю, что этот вопрос немного старый, но лучше поздно, чем никогда ...

Вот обходная работа, чтобы прекратить мерцание, когда пользователь изменяет форму, но не испортив чертеж элементов управления, таких как DataGridView. При условии, что ваша форма «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;
}

Другие советы

Я нашел хитрость, чтобы иметь хороший плавный изменение размера и показать свои линии сетки, заключался в том, чтобы добавить дополнительный флаг, если мое приложение работает под Windows XP или Windows Server 2003:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;

        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED  

        if (this.IsXpOr2003 == true)
            cp.ExStyle |= 0x00080000;  // Turn on WS_EX_LAYERED

        return cp;
    }
}

private Boolean IsXpOr2003
{
   get
   {
       OperatingSystem os = Environment.OSVersion;
       Version vs = os.Version;

       if (os.Platform == PlatformID.Win32NT)
           if ((vs.Major == 5) && (vs.Minor != 0))
               return true;
           else
               return false;
       else
           return false;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top