Пользовательская панель формы Windows с прозрачной дочерней проблемой
Я создал пользовательскую панель (унаследованную от Panel), которая переопределяет метод OnPaint для рисования внутреннего прямоугольника с помощью LinearGradientBrush.
public void PaintPanel()
{
// Re-calculate the
CalculatePanelHeight();
Graphics _g = this.CreateGraphics();
Point _startPoint = new Point(0, m_TopAreaHeight);
Size _size = new Size(Width, m_BtmAreaHeight);
Rectangle _btmRect = new Rectangle(_startPoint, _size);
LinearGradientBrush _btmGradBrush = new LinearGradientBrush(_btmRect, BackColorBottom, BackColorBottom2, LinearGradientMode.Vertical);
_btmGradBrush.GammaCorrection = true;
_g.FillRectangle(_btmGradBrush, _btmRect);
...
}
protected override void OnPaint(PaintEventArgs e)
{
PaintPanel();
base.OnPaint(e);
}
Однако есть 2 причуды:
Когда любой элемент управления с прозрачным фоном перетаскивается на пользовательскую панель, его фон становится белым.
Моя пользовательская панель не поддерживает прозрачный фон (цвет становится белым, когда я устанавливаю один из цветов градиента на прозрачный).
Кто-нибудь может предложить некоторые идеи, пожалуйста?
Спасибо.
1 ответ
Истинная прозрачность не существует в Windows Forms. Это ограничение Windows, оно не поддерживает его в дочерних окнах. Для этого есть несколько приемов обхода, например стиль окна WS_EX_TRANSPARENT и некоторая поддержка, встроенная в winforms для прозрачного BackColor. Они оба работают, прося родителя элемента управления нарисовать себя в окне элемента управления, предоставляя фоновые пиксели.
Это ломается, когда вы начинаете перекрывать элементы управления, вы видите фон родительского элемента (обычно в форме), а не перекрывающийся элемент управления. И если BackColor вашей формы белый, то вы действительно увидите белый цвет, а не градиент промежуточного элемента управления.
Для этого нет практического решения. Если вы хотите истинной прозрачности, тогда вам стоит подумать о WPF. Он не использует окна, только слои краски. Прозрачность теперь тривиальна, просто не рисуйте.