Кнопки двойной буферизации в c #

Я работал над одним проектом последние несколько месяцев, и у меня возникла одна проблема, которую я не могу решить. У меня есть форма Windows с элементами управления. Когда пользователь изменяет размер элементов управления, приложение запускает событие sizechanged, и я перемещаю элементы управления на нем соответствующим образом. Основная проблема связана с кнопками, потому что у них есть изображения - точнее говоря, они плоские, без рамки и на них есть изображение, которое на самом деле нарисованная кнопка (причина, по которой я не рисую ее с помощью кода, заключается в том, что изображение является сложным). На некоторых машинах они начинают мерцать при изменении размера приложения. Для формы установлено значение DoubleBuffered true, и я использовал эту функцию для установки двойного буфера на кнопках.

public static void SetDoubleBuffered(System.Windows.Forms.Control c)
    {
        if (System.Windows.Forms.SystemInformation.TerminalServerSession)
            return;

        System.Reflection.PropertyInfo aProp =
              typeof(System.Windows.Forms.Control).GetProperty(
                    "DoubleBuffered",
                    System.Reflection.BindingFlags.NonPublic |
                    System.Reflection.BindingFlags.Instance);

        aProp.SetValue(c, true, null);
    }

Какие-либо предложения?


person n1tr0    schedule 15.10.2011    source источник
comment
При изменении размера формы вы используете какой-либо специальный код для обработки события изменения размера или просто код по умолчанию? Если пользовательский, приостанавливаете ли вы макет формы, пока все элементы управления изменяются или перемещаются?   -  person Chris Thompson    schedule 16.10.2011
comment
Я использую собственный код и не использую SuspendLayout, но я пробовал его сейчас, и, насколько я вижу, происходит то же самое (придется протестировать его на другом компьютере, чтобы увидеть более четко). У меня примерно 10 кнопок, и я меняю их левую и верхнюю часть в событии SizeChanged.   -  person n1tr0    schedule 16.10.2011
comment
Класс Button уже включает двойную буферизацию. Ваша проблема в другом.   -  person Hans Passant    schedule 16.10.2011
comment
возможный дубликат Как исправить мерцание в пользовательских элементах управления   -  person Hans Passant    schedule 16.10.2011
comment
Некоторые из методов, перечисленных в этом разделе, вызывают много ошибок в моих методах рисования, поэтому мне нужно будет проверить их еще немного.   -  person n1tr0    schedule 24.10.2011


Ответы (1)


Это мне очень помогло, когда у меня были проблемы с двойной буферизацией. Код немного устарел, но все еще охватывает основы.

http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx

Надеюсь, это поможет. :)

person Vincent van der Linden    schedule 18.10.2011