具有透明子问题的Windows窗体自定义面板

时间:2010-10-04 09:22:54

标签: .net winforms transparency panel

我创建了一个自定义面板(继承自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);
}

但是有两个怪癖:

  1. 只要将具有透明背景的任何控件拖入自定义面板,其背景就会变为白色。

  2. 我的自定义面板不支持透明背景(每当我将其中一种渐变颜色设置为透明时,颜色会变为白色。)

  3. 有人会提供一些见解吗?

    谢谢。

1 个答案:

答案 0 :(得分:0)

Windows窗体中不存在真正的透明度。这是Windows限制,它不支持子窗口。它有一些解决方法技巧,比如WS_EX_TRANSPARENT窗口样式和一些透明的BackColor的winforms内置支持。它们都通过要求控件的父级在控制窗口中绘制自己,提供背景像素来工作。

当您开始重叠控件时会出现故障,您会看到父级的背景(通常是表单),而不是重叠的控件。如果你的表格的BackColor是白色,那么你确实会看到白色,而不是中间控件的渐变。

这没有实际的解决方法。如果你想要真正的透明度,那么你应该考虑WPF。它不使用窗户,只是油漆层。透明度现在是微不足道的,只是不要画画。