Щелчок фоновой метки на пользовательском элементе управления WinForms с включенным фоновым изображением

Я работаю над проектом формы Windows и у меня возникли некоторые проблемы с UserControl Double Buffering. Я создал usercontrol и имеет фоновое изображение, а затем у меня есть несколько переключателей и ярлыков. Радиокнопки и метки имеют прозрачный фон в виде цвета. Однако когда я показываю и скрываю пользовательский элемент управления, я вижу мерцание на тех ярлыках и переключателях, которые имеют прозрачный фон.

И я попробовал

Me.SetStyle(ControlStyles.DoubleBuffer _
Or ControlStyles.AllPaintingInWmPaint _
Or ControlStyles.UserPaint _
Or ControlStyles.SupportsTransparentBackColor, _
True)

После initializeComponent() включить двойной буфер на этом пользовательском элементе управления, но, похоже, он не работает.

1 ответ

Решение

Это не источник мерцания, который может решить двойная буферизация. Когда UC перерисовывает себя, он рисует фоновое изображение, оставляя дыры в местах управления. Затем каждый из элементов управления должен нарисовать себя, заполняя отверстие, сначала попросив UC снова нарисовать себя, чтобы получить фоновые пиксели, а затем нарисовать себя сверху. Временная дыра - это то, что вы видите как мерцание.

Вы можете сделать это менее нежелательным, позволив UC рисовать себя в клиентской области элементов управления, чтобы фон был уже настроен правильно. Вставьте этот код в класс UserControl:

protected override CreateParams CreateParams {
  get {
    var parms = base.CreateParams;
    parms.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN
    return parms;
  }
}

Это не делает картину более быстрой и может иметь побочные эффекты. Если это по-прежнему проблема, вам нужно ускорить рисование BackgroundImage. Премасштабируйте его до размера клиента пользовательского элемента управления, чтобы его можно было рисовать без изменения масштаба. Используйте формат PixelFormat.Format32bppPArgb для растрового изображения, он примерно в 10 раз быстрее любого другого на большинстве видеоадаптеров.

Другие вопросы по тегам