Пользовательская панель формы Windows с прозрачной дочерней проблемой - PullRequest
0 голосов
/ 04 октября 2010

Я создал пользовательскую панель (унаследованную от 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 Ответ

0 голосов
/ 04 октября 2010

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

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

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

...