網上很多寫著透明Panel的方法,都是把BackColor屬性設置為透明,然後指定Parent,實驗了一下,對於部分情況下,是可用的,例如下層本身有自帶的控制項,但是,如果是用Graphic繪製的內容,上層放一個設置了BackColor為透明的Panel則不起作用。 Google了一下,在Stack ...
網上很多寫著透明Panel的方法,都是把BackColor屬性設置為透明,然後指定Parent,實驗了一下,對於部分情況下,是可用的,例如下層本身有自帶的控制項,但是,如果是用Graphic繪製的內容,上層放一個設置了BackColor為透明的Panel則不起作用。
Google了一下,在Stack Overflow上找到了一個自定義透明Panel
public class ExtendedPanel : Panel { private const int WS_EX_TRANSPARENT = 0x20; public ExtendedPanel() { SetStyle(ControlStyles.Opaque, true); } private int opacity = 50; [DefaultValue(50)] public int Opacity { get { return this.opacity; } set { if (value < 0 || value > 100) throw new ArgumentException("value must be between 0 and 100"); this.opacity = value; } } protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT; return cp; } } protected override void OnPaint(PaintEventArgs e) { using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100, this.BackColor))) { e.Graphics.FillRectangle(brush, this.ClientRectangle); } base.OnPaint(e); } }
這個自定義Panel可以解決問題,下圖就是效果,透明的灰色是ExtendedPanel,黑色畫線部分則是Graphic繪製的。