щелчок фоновой метки на пользовательском элементе управления WinForms с включенным фоновым изображением - PullRequest
1 голос
/ 16 марта 2010

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

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

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

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

1 Ответ

3 голосов
/ 16 марта 2010

Это не источник мерцания, который может решить двойная буферизация. Когда 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 раз быстрее любого другого на большинстве видеоадаптеров.

...