Вопрос

У меня есть приложение, которое имеет тонну элемента управления.И это имеет огромное количество мерцания, особенно при запуске.

Я подал заявку на это fix Это.

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

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

Как я сохраняю WS_EX_COMPONITON, еще сохраняя удобство максимизации, минимизации и закрытых кнопок?

Это происходит на Windows XP.Как указал @falleNiDol, это не проблема в Windows 7.

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

Решение

Я подумал это.Хитрость состоит в том, чтобы удалить флаг WS_EX_Composited после отображения формы.Полное объяснение и код в моем блоге:

Как избавиться от мерцания на Windows Формы Приложения

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

Я знаю, этот вопрос немного старый, но лучше поздно, чем никогда.Я использовал ваш оригинальный пример, который вы связали, чтобы придумать тот, который переключает его при изменении размера, затем переключает его, чтобы сделать все остальное идеально.Надеюсь, это помогает другим искать решение этой проблемы.Как знает ОП, в одних свойствах с двойным шаром не решают мерцающие проблемы.

Вот работа - вокруг, чтобы остановить мерцание, когда пользователь изменяет изменение формы, но без возобновления чертежа таких элементов управления, как DataGridView, Numericusdown и т. Д. При условии, что имя формы «Форма1»:

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;
}
.

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

        // Enable double duffering to stop flickering.
        this.SetStyle(ControlStyles.DoubleBuffer, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, false);
        this.SetStyle(ControlStyles.Opaque, false);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.ResizeRedraw, true);
.

Ваш должен попробовать стандартные Windows Forms Control Property, под названием DoveBuffeded. http://msdn.microsoft.com/EN-US / Library / System.Windows.forms.Control.doublebufted.aspx

Я только что наткнулся на этот пост и понимаю, что это немного старое.Тем не менее, у меня такая же проблема с моей формой и обнаружена (для XP, в любом случае), нерешенное решение, кажется, не позволяет визуальным стилям.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top