Проверка того, был ли дочерний элемент управления установлен BackColor пользователем

У меня много трудностей с пользовательской панелью, которую я создаю.

У него закругленные углы, и поэтому его BackColor виден только в углах, а основной цвет панели — это отдельный цвет, m_mainPanelColour. К сожалению, когда я добавляю элемент управления, добавляемый элемент управления устанавливает для параметра BackColor значение Panel.BackColor, а не m_mainPanelColour.

Я переопределил событие OnControlAdded, чтобы установить для параметра BackColor только что добавленного элемента управления значение m_mainPanelColour, однако я понял, что хочу такого поведения только в том случае, если параметр BackColor элемента управления не был явно установлен пользователем.

Моя проблема в том, что я не знаю, как запросить элемент управления для этого сценария. Однако это должно быть возможно, потому что это делает стандартная панель Windows.

У кого-нибудь есть предложения? Заранее спасибо.


person user3020788    schedule 12.12.2013    source источник
comment
Разве вы не можете сделать m_mainPanelColour фоновым цветом панели? Я думаю, что дочерний контроль просто использует атмосферу, чтобы наследовать фон родителя.   -  person Adriano Repetti    schedule 12.12.2013


Ответы (1)


Возможно, вы захотите объявить Sub New() в своем пользовательском элементе управления и добавить следующие строки кода перед InitializeComponent():

SetStyle(ControlStyles.ResizeRedraw Or _
         ControlStyles.AllPaintingInWmPaint Or _
         ControlStyles.OptimizedDoubleBuffer Or _
         ControlStyles.SupportsTransparentBackColor Or _
         ControlStyles.UserPaint, True)

UpdateStyles()

Это включит поддержку прозрачного цвета фона. Таким образом, вы можете сделать цвет по умолчанию для элемента управления Color.Transparent, и поэтому он будет окрашен только в том случае, если пользователь элемента управления выберет другой цвет. Конечно, вам придется взять на себя покраску всего элемента управления самостоятельно.

Обычно e.Graphics.Clear(Color.Transparent) быстро заполняет элемент управления прозрачным черным цветом (&H0I). Но помните, если вы обращаетесь к объекту Graphics вне события рисования (например, вызывая Me.CreateGraphics), вы не сможете легко очистить фон до прозрачности.

person Nathan M    schedule 12.12.2013
comment
Спасибо, да, я вижу, как это даст нужный мне эффект. Не будет ли проблем с производительностью при рисовании Color.Transparent по умолчанию? Мне также любопытно, как панель Windows может определить, когда пользователь установил BackColor. - person user3020788; 13.12.2013
comment
Вы можете переопределить свойство BackColor и добавить свой собственный код, чтобы, если пользователь изменит BackColor, вы могли установить внутренний флаг для вашего элемента управления. Вероятно, не было бы каких-либо заметных проблем с производительностью при рисовании BackColor как прозрачного, я не верю. - person Nathan M; 16.12.2013