1. 程式人生 > >C#實現Winform自定義半透明遮罩層

C#實現Winform自定義半透明遮罩層

複製程式碼
using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;

namespace MyOpaqueLayer
{
    /// <summary>
    /// 自定義控制元件:半透明控制元件
    /// </summary>
    /* 
     * [ToolboxBitmap(typeof(MyOpaqueLayer))]
     * 用於指定當把你做好的自定義控制元件新增到工具欄時,工具欄顯示的圖示。
     * 正確寫法應該是
     * [ToolboxBitmap(typeof(XXXXControl),"xxx.bmp")]
     * 其中XXXXControl是你的自定義控制元件,"xxx.bmp"是你要用的圖示名稱。
    
*/ [ToolboxBitmap(typeof(MyOpaqueLayer))] public class MyOpaqueLayer : System.Windows.Forms.Control { private bool _transparentBG = true;//是否使用透明 private int _alpha = 125;//設定透明度 private System.ComponentModel.Container components = new System.ComponentModel.Container();
public MyOpaqueLayer() : this(125, true) { } public MyOpaqueLayer(int Alpha, bool IsShowLoadingImage) { SetStyle(System.Windows.Forms.ControlStyles.Opaque, true); base.CreateControl(); this._alpha = Alpha;
if (IsShowLoadingImage) { PictureBox pictureBox_Loading = new PictureBox(); pictureBox_Loading.BackColor = System.Drawing.Color.White; pictureBox_Loading.Image = 載入中.Properties.Resources.loading; pictureBox_Loading.Name = "pictureBox_Loading"; pictureBox_Loading.Size = new System.Drawing.Size(48, 48); pictureBox_Loading.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; Point Location = new Point(this.Location.X + (this.Width - pictureBox_Loading.Width) / 2, this.Location.Y + (this.Height - pictureBox_Loading.Height) / 2);//居中 pictureBox_Loading.Location = Location; pictureBox_Loading.Anchor = AnchorStyles.None; this.Controls.Add(pictureBox_Loading); } } protected override void Dispose(bool disposing) { if (disposing) { if (!((components == null))) { components.Dispose(); } } base.Dispose(disposing); } /// <summary> /// 自定義繪製窗體 /// </summary> /// <param name="e"></param> protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { float vlblControlWidth; float vlblControlHeight; Pen labelBorderPen; SolidBrush labelBackColorBrush; if (_transparentBG) { Color drawColor = Color.FromArgb(this._alpha, this.BackColor); labelBorderPen = new Pen(drawColor, 0); labelBackColorBrush = new SolidBrush(drawColor); } else { labelBorderPen = new Pen(this.BackColor, 0); labelBackColorBrush = new SolidBrush(this.BackColor); } base.OnPaint(e); vlblControlWidth = this.Size.Width; vlblControlHeight = this.Size.Height; e.Graphics.DrawRectangle(labelBorderPen, 0, 0, vlblControlWidth, vlblControlHeight); e.Graphics.FillRectangle(labelBackColorBrush, 0, 0, vlblControlWidth, vlblControlHeight); } protected override CreateParams CreateParams//v1.10 { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x00000020; //0x20; // 開啟 WS_EX_TRANSPARENT,使控制元件支援透明 return cp; } } /* * [Category("myOpaqueLayer"), Description("是否使用透明,預設為True")] * 一般用於說明你自定義控制元件的屬性(Property)。 * Category用於說明該屬性屬於哪個分類,Description自然就是該屬性的含義解釋。 */ [Category("MyOpaqueLayer"), Description("是否使用透明,預設為True")] public bool TransparentBG { get { return _transparentBG; } set { _transparentBG = value; this.Invalidate(); } } [Category("MyOpaqueLayer"), Description("設定透明度")] public int Alpha { get { return _alpha; } set { _alpha = value; this.Invalidate(); } } } }
複製程式碼