using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Text; using System.Windows.Forms; namespace TransparentPanelTest { public class TransparentPanel : Control { private Color _borderColor; private int _borderWidth = 1; private DashStyle _borderStyle = DashStyle.Solid; private int _opacity = 125; public TransparentPanel() { } #region Property [Category("Custom"), Description("Border Color")] public Color BorderColor { set { _borderColor = value; } get { return _borderColor; } } [Category("Custom"), Description("Border Width"), DefaultValue(1)] public int BorderWidth { set { if (value < 0) value = 0; _borderWidth = value; } get { return _borderWidth; } } [Category("Custom"), Description("Border Style"), DefaultValue(DashStyle.Solid)] public DashStyle BorderStyle { set { this._borderStyle = value; this.Invalidate(); } get { return this._borderStyle; } } [Bindable(true), Category("Custom"), DefaultValue(125), Description("背景的透明度. 有效值0-255")] public int Opacity { get { return _opacity; } set { if (value > 255) value = 255; else if (value < 0) value = 0; _opacity = value; this.Invalidate(); } } #endregion protected override void OnPaintBackground(PaintEventArgs e) { //do not allow the background to be painted } protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT return cp; } } protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { if (this._opacity > 0) { e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(this._opacity, this.BackColor)), this.ClientRectangle); } if (this._borderWidth > 0) { Pen pen = new Pen(this._borderColor, this._borderWidth); pen.DashStyle = this._borderStyle; e.Graphics.DrawRectangle(pen, e.ClipRectangle.Left, e.ClipRectangle.Top, this.Width - 1, this.Height - 1); pen.Dispose(); } } } }