1. 程式人生 > >C#圖片半透明效果

C#圖片半透明效果

目前有個任務,需要實現圖片顏色半透明,效果如下圖:


測試了一下,使用方法為在上面自定義一個控制元件,在控制元件上用指定顏色繪製一個矩形,並指定其為半透明(alpha方式)。

定義控制元件

定義控制元件如下內容:

public MyOpaqueLayer()//構建函式  含有引數的初始化,主要是alpha值、遮罩顏色等。

典型的構建函式為:

 	 public MyOpaqueLayer(int Alpha, bool IsShowLoadingImage)
        {
            SetStyle(System.Windows.Forms.ControlStyles.Opaque, true);
            base.CreateControl();
            this._alpha = Alpha;
            _new_brush_color = new Color();
            _new_brush_color = Color.Transparent;
        } 	

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)       /// 自定義繪製窗體  繪製矩形併疊加
典型的繪製函式為
   /// <summary>
        /// 自定義繪製窗體
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {

            float vlblControlWidth;
            float vlblControlHeight;

            Pen labelBorderPen;
            SolidBrush labelBackColorBrush;
            
            //透明處理筆刷
            Color drawColor = Color.FromArgb(this._alpha, _new_brush_color);
            labelBorderPen = new Pen(drawColor, 0);
            labelBackColorBrush = new SolidBrush(drawColor);

       
            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    //在msdn中註明重定義的內容,主要是設定控制元件風格,使其支援透明

典型程式碼為:

        protected override CreateParams CreateParams//v1.10 
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020; //0x20;  // 開啟 WS_EX_TRANSPARENT,使控制元件支援透明
                return cp;
            }
        }
兩個設定專案:
   private int _alpha = 125;//設定透明度  
        public Color _new_brush_color;
        [Category("MyOpaqueLayer"), Description("設定透明度")]
        public int Alpha
        {
            get
            {
                return _alpha;
            }
            set
            {
                _alpha = value;
                this.Invalidate();
            }
        }
        [Category("MyOpaqueLayer"), Description("設定蒙層顏色")]
        public Color new_brush_color
        {
            get
            {
                return _new_brush_color;
            }
            set
            {
                _new_brush_color = value;
                this.Invalidate();
            }
        }

使用

使用在需要蒙色的地方加上這幾句(其中_alpha請替換成你需要的透明度,colorDialog1.Color請替換成你希望的顏色)

   this.m_OpaqueLayer = new MyOpaqueLayer.MyOpaqueLayer(_alpha, false);
   m_OpaqueLayer.Alpha = _alpha;
   m_OpaqueLayer.new_brush_color = colorDialog1.Color;
   pictureBox1.Controls.Add(this.m_OpaqueLayer);
   this.m_OpaqueLayer.Dock = DockStyle.Fill;

注意如下事項:
  • 開啟 WS_EX_TRANSPARENT,使控制元件支援透明
  • 在更新引數(包含遮罩顏色和alpha透明度)之後要重新整理控制元件,重新整理時注意,你的自定義控制元件新增到誰那裡就重新整理誰。如果你做的半透明是一個picture而重新整理form,結果就是沒反應,需要把視窗切到後臺再切回來才回變化。