C#圖片半透明效果
阿新 • • 發佈:2019-01-06
目前有個任務,需要實現圖片顏色半透明,效果如下圖:
測試了一下,使用方法為在上面自定義一個控制元件,在控制元件上用指定顏色繪製一個矩形,並指定其為半透明(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) /// 自定義繪製窗體 繪製矩形併疊加
典型的繪製函式為
protected override CreateParams CreateParams //在msdn中註明重定義的內容,主要是設定控制元件風格,使其支援透明/// <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//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,結果就是沒反應,需要把視窗切到後臺再切回來才回變化。