我创建了一个自定义面板(继承自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);
}
但是有两个怪癖:
只要将具有透明背景的任何控件拖入自定义面板,其背景就会变为白色。
我的自定义面板不支持透明背景(每当我将其中一种渐变颜色设置为透明时,颜色会变为白色。)
有人会提供一些见解吗?
谢谢。
答案 0 :(得分:0)
Windows窗体中不存在真正的透明度。这是Windows限制,它不支持子窗口。它有一些解决方法技巧,比如WS_EX_TRANSPARENT窗口样式和一些透明的BackColor的winforms内置支持。它们都通过要求控件的父级在控制窗口中绘制自己,提供背景像素来工作。
当您开始重叠控件时会出现故障,您会看到父级的背景(通常是表单),而不是重叠的控件。如果你的表格的BackColor是白色,那么你确实会看到白色,而不是中间控件的渐变。
这没有实际的解决方法。如果你想要真正的透明度,那么你应该考虑WPF。它不使用窗户,只是油漆层。透明度现在是微不足道的,只是不要画画。