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

  2. Моя пользовательская панель не поддерживает прозрачный фон (цвет становится белым, когда я устанавливаю один из цветов градиента на прозрачный).

Кто-нибудь может предложить некоторые идеи, пожалуйста?

Спасибо.

1 ответ

Истинная прозрачность не существует в Windows Forms. Это ограничение Windows, оно не поддерживает его в дочерних окнах. Для этого есть несколько приемов обхода, например стиль окна WS_EX_TRANSPARENT и некоторая поддержка, встроенная в winforms для прозрачного BackColor. Они оба работают, прося родителя элемента управления нарисовать себя в окне элемента управления, предоставляя фоновые пиксели.

Это ломается, когда вы начинаете перекрывать элементы управления, вы видите фон родительского элемента (обычно в форме), а не перекрывающийся элемент управления. И если BackColor вашей формы белый, то вы действительно увидите белый цвет, а не градиент промежуточного элемента управления.

Для этого нет практического решения. Если вы хотите истинной прозрачности, тогда вам стоит подумать о WPF. Он не использует окна, только слои краски. Прозрачность теперь тривиальна, просто не рисуйте.

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