Проблема с перерисовкой в ​​Windows10 с помощью DoubleBuffering и FormBorderStyle.

У меня проблема с проектом Windows Forms, который я могу воспроизвести только на Windows 10 машине (в Windows 7 он работает). Я думаю, что могу изолировать источник проблемы, а именно, если я включу двойную буферизацию и установлю FormBorderStyle на None, а затем, если я изменю размер формы, например. в обработчике событий части фона и некоторые элементы управления не перерисовываются. Тоже так, что иногда срабатывает (один раз из пяти).

Не перерисовано выглядит так (часто немного иначе):

введите описание изображения здесь

и так должно получиться:

введите описание изображения здесь

Чтобы воспроизвести проблему, просто поместите пару элементов управления в форму (может быть, количество также важно), включите двойную буферизацию, переопределив CreateParams, FormBorderStyle=None (с другим стилем границы это работает!).

Код позади:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
            return cp;
        }
    }

    private bool small = true;
    private void button1_Click(object sender, EventArgs e)
    {
        //toggle the form's size
        Height = Height + 300*(small?-1:1);
        small = !small;
    }

    private void button5_Click(object sender, EventArgs e)
    {
        Close();
    }
}

Вопрос:
Это известная ошибка от MS (или, возможно, намерение избавиться от форм Windows;)) в Windows 10?
Есть идеи?
Двойная буферизация и отсутствие граница должна быть.

Обновление: у меня Win 10 Pro версии: 1703; Сборка 15063.1155.
Обновление2: Тест на Win 10 Pro Версия: 1709; Сборка 16299.492 - та же проблема.

Обновление 3: Тест на Win 10 Домашняя версия: 1803 - намного лучше (мне потребовалось несколько минут тестирования, чтобы воспроизвести его), но проблема все еще возникает. Этот тест проводился на другом компьютере с другой графической картой.

Обходной путь:
Боюсь, мне придется пойти по этому пути в качестве обходного пути A: Удалите строку заголовка в Windows Forms и установите FormBorderStyle, например, на FixedToolWindow.


person Rekshino    schedule 13.08.2018    source источник
comment
Точная версия сборки Win10 имеет большое значение. Они внесли радикальные изменения в унаследованный код Win32, особенно в ранних выпусках Insider было довольно много ошибок. Это не остановило, сейчас выпускаются превью RS4. Если вы в последнее время не обновлялись или не использовали предварительные сборки Insider, то сначала вам стоит начать с них.   -  person Hans Passant    schedule 13.08.2018
comment
Невозможно воспроизвести проблему в Windows 10 (версия 1803, сборка 17134.165). Может это связано с драйвером вашей видеокарты?   -  person NineBerry    schedule 13.08.2018
comment
Win 10 Pro Версия: 1703; Сборка 15063.1155   -  person Rekshino    schedule 13.08.2018
comment
@HansPassant Хм .. :( Тогда я попробую найти возможность протестировать другую сборку, например, от NineBerry.   -  person Rekshino    schedule 13.08.2018
comment
Ага, вы отстали на две версии. Постоянно обновлять его очень важно.   -  person Hans Passant    schedule 13.08.2018
comment
@HansPassant Скажи это нашей системе. админы .. :( Но может в новой версии починили :)   -  person Rekshino    schedule 13.08.2018
comment
@NineBerry Я постараюсь выяснить это, но сначала, думаю, я попробую протестировать более новую версию Windows, если найду ее.   -  person Rekshino    schedule 13.08.2018
comment
@HansPassant В Windows 10 Home (1803) проблема все еще появляется. См. Update3.   -  person Rekshino    schedule 11.09.2018
comment
@NineBerry С другой видеокартой проблема все еще появляется. См. Update3.   -  person Rekshino    schedule 11.09.2018
comment
Можете ли вы предоставить полный проект, в котором воспроизводится проблема?   -  person NineBerry    schedule 11.09.2018
comment
@NineBerry Я разместил содержимое файлов в чате   -  person Rekshino    schedule 11.09.2018
comment
Я могу подтвердить, что проблема иногда возникает с демонстрационным проектом. С кодом вроде все нормально. Понятия не имею, извините.   -  person NineBerry    schedule 11.09.2018


Ответы (1)


Для меня это похоже на ошибку в ОС, но я нашел, как заставить ее работать, не отказываясь от DoubleBuffering и FormBorderStyle=None.

Если стиль окна будет расширен на

cp.ExStyle |= 0x00080000;   // Turn on WS_EX_LAYERED

дальше все работает как положено.

person Rekshino    schedule 13.09.2018