Как установить защищенное свойство элементов управления на форме, которая страдает от мерцания? DoubleBuffered
Как дублировать буфер управления .NET в форме?
ответ
Вот более общая версия Dummy's solution.
Мы можем использовать отражение, чтобы попасть в защищенное свойство DoubleBuffered, а затем его можно установить на true.
Примечание: Вы должны pay your developer taxes и не use double-buffering if the user is running in a terminal services session (например, Remote Desktop) Этот вспомогательный метод не получится двойной буферизации, если человек работает в удаленном рабочем столе.
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);
}
public void EnableDoubleBuffering()
{
this.SetStyle(ControlStyles.DoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint,
true);
this.UpdateStyles();
}
System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control)
.GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
aProp.SetValue(ListView1, true, null);
Ian имеет больше информации об использовании этого на сервере терминалов.
Это делает трюк. я сделал его общей вспомогательной функцией и разместил его здесь. – 2008-09-17 14:23:12
Это не действительно для * на * терминальном сервере, так как ни один из моих клиентов не запускает программное обеспечение с сеанса удаленного рабочего стола. Но вы должны платить налоги с вашего разработчика, и я не хотел выпускать код, который еще не включал налоги. – 2008-09-19 19:38:45
Вы также можете наследовать элементы управления в свои собственные классы и установить там свойство. Этот метод также хорош, если вы, как правило, выполняете множество настроек, что одинаково для всех элементов управления.
Один из способов - расширить определенный элемент управления, который вы хотите удвоить буфер, и установить свойство DoubleBuffered внутри ctor управления.
Например:
class Foo : Panel
{
public Foo() { DoubleBuffered = true; }
}
Я работаю с владельцем, нарисованным ListView в производном классе. Это решило проблему отлично! – 2010-02-27 12:00:51
Я не знаю, есть ли какие-то недостатки, но это сработало отлично. Мой пользовательский элемент управления ранее унаследовал от «Control», и я просто изменил его, чтобы наследовать от «Panel» вместо этого, и установите DoubleBuffered в true. Изменение двух строк. Движение плавное ... и скорость рисования одного обновления кажется намного быстрее. – 2017-07-07 05:57:31
Перед тем, как попробовать двойную буферизацию, увидеть, если SuspendLayout()/ResumeLayout() решить вашу проблему.
Suspend/ResumeLayout не решает проблему мерцания при рисовании. – 2009-10-29 17:20:48
Я обнаружил, что просто установка параметра DoubleBuffered в форме автоматически устанавливает все перечисленные здесь свойства.
Однако; Я обнаружил, что двойная буферизация, предоставляемая winforms, будет меньше, чем велика. This little gem of a code snippetдействительно имеет значение, серьезно попробуйте. Я провел долго ищет решения, которые работали и, наконец, нашли, что :-)
Проверить this thread
Повторяя ядро этого ответа, вы можете включить флаг WS_EX_COMPOSITED стиля на окно, чтобы получить как форма, так и все ее элементы управления с двойным буферизацией. Флаг стиля доступен с XP. Это не делает живопись быстрее, но все окно рисуется в буфер вне экрана и разлетается на экране одним ударом. Заставляя его смотреть мгновенно на глаза пользователя без видимых артефактов. Это не совсем безотказно, некоторые визуальные визуализаторы стилей могут сработать на нем, особенно TabControl, когда у него слишком много вкладок. YMMV.
Вставить этот код в свой класс формы:
protected override CreateParams CreateParams {
get {
var cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
Большая разница между этим методом и поддержки двойной буферизации Winform является то, что версия Winform работает только на одном элементе управления в момент времени. Вы по-прежнему будете видеть каждую отдельную контрольную краску. Который может выглядеть как эффект мерцания, особенно если неокрашенный прямоугольник управления плохо контрастирует с фоном окна.
nobugz получает кредит за метод в своей ссылке, я просто переписываю. Добавьте это переопределение Формы:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
Это работает лучше для меня, на Windows 7 я получал большие черные блоки появляются при изменении размера тяжелой формы управления. Теперь контроль теперь отскакивает! Но это лучше.
метод Extension превратить двойную буферизацию включения или выключения для управления
public static class ControlExtentions
{
/// <summary>
/// Turn on or off control double buffering (Dirty hack!)
/// </summary>
/// <param name="control">Control to operate</param>
/// <param name="setting">true to turn on double buffering</param>
public static void MakeDoubleBuffered(this Control control, bool setting)
{
Type controlType = control.GetType();
PropertyInfo pi = controlType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(control, setting, null);
}
}
использования (например, как сделать DataGridView DoubleBuffered):
DataGridView _grid = new DataGridView();
// ...
_grid.MakeDoubleBuffered(true);
Это заставило меня много из печаль в течение двух дней с контролем третьей стороны, пока я не отследил ее.
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
Я недавно был много отверстий (помет) при повторной калибровке/перерисовке элемента управления, содержащее несколько других элементов управления.
Я попытался WS_EX_COMPOSITED и WM_SETREDRAW, но ничего не получалось, пока я не использовал это:
private void myPanel_SizeChanged(object sender, EventArgs e)
{
Application.DoEvents();
}
Просто хотел передать его.
vb.net версия этого прекрасного решения ....:
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or &H2000000
Return cp
End Get
End Property
- 1. Как дублировать компонент/элемент управления?
- 2. Дублировать ключи в словарях .NET?
- 3. .NET VS2005 WinForms: Как удалить пользовательский элемент управления в форме?
- 4. Как дублировать элемент управления при нажатии
- 5. Как дублировать пользовательский элемент управления (панель) программно
- 6. поточно-буфер для .NET
- 7. Как дублировать фрагмент & [u8]?
- 8. Боковое меню в форме окна в .net
- 9. Прозрачные элементы управления в .NET
- 10. Resize управления пользователя в форме
- 11. Поток управления в ASP.NET форме
- 12. Просмотреть контейнер управления в форме
- 13. Панель управления содержимым в форме
- 14. Как показать Предварительный просмотр в форме управления?
- 15. Как изменить элемент управления в другой форме?
- 16. Форма управления по форме
- 17. Дублировать текст интервала в текстовое поле в форме
- 18. Обновление управления в другой форме
- 19. Как перемещаться по всем элементам управления в форме, включая элементы управления в подчиненной форме - Access 2007
- 20. Как написать буфер в буфер
- 21. Как добавить .Net-контроль в форме MSAccess 2003?
- 22. Проблема с элементами управления в форме MDI
- 23. Двойной щелчок элемента управления .NET Label копирует свой текст в буфер обмена на Vista +?
- 24. Как создать элемент управления activex в форме C# .net windows и как развернуть
- 25. .NET и Excel Interop: Копирование Выбор пользователя в буфер обмена
- 26. Закрепить изображение в определенной форме. NET
- 27. Ошибка в форме MVC3 завершения заполнения .Net
- 28. Сжатый текст в прозрачной форме .NET
- 29. Как получить изображение, загруженное в настоящее время в элемент управления WebBrowser. NET
- 30. Центр управления при максимальной форме
Этот код решил мою проблему без каких-либо изменений. Благодаря! – Mykroft 2009-04-24 15:18:58
Забавно, я думаю, что еще более важно удваивать буфер при удалении, чтобы избежать ненужной отправки кучу ретрансляций по проводу? – 2009-06-11 14:50:52