Включение двойной буферизации

Я видел следующий код для включения двойной буферизации в winform:

// Activates double buffering 
this.SetStyle(ControlStyles.DoubleBuffer |
   ControlStyles.OptimizedDoubleBuffer |
   ControlStyles.UserPaint |
   ControlStyles.AllPaintingInWmPaint, true);
this.UpdateStyles();

Отличается ли это каким-либо образом от простой установки Form.DoubleBuffering = true?

4 ответа

Решение

Control.DoubleBuffering выполняет

SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, value);

так что ваши кодовые наборы ControlStyles.UserPaint а также (что, вероятно, не влияет на данный момент).

Установка DoubleBuffering формы установит двойную буферизацию для этой формы. Это так же, как звонить

form.SetStyle(ControlStyles.OptimizedDoubleBuffer, value);

Другие флаги, такие как UserPaint и AllPaintingInWmPaint, являются стилями, которые не устанавливаются простой установкой control.DoubleBuffering = true

В.NET 1.х не было DoubleBuffered собственность на элементы управления, так SetStyle был единственный способ включить его. Код вашего видения, который использует SetStyle Вероятно, либо до 1.x дней, либо от разработчиков, которые с тех пор просто не изменили свои привычки.

Из Stackru: Как удвоить буфер управления.NET формы?:

public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
   //Taxes: Remote Desktop Connection and painting
   //http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx
   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); 
}
Другие вопросы по тегам