-
-
-
-
-
-
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace MyUserControl
- {
- [ToolboxItem(false), Browsable(false), Description("用于屏蔽用户界面的控件;")]
- public partial class MaskLayer : Control
- {
- private int alpha;
- private Boolean bShow = true;
- Timer timer = new Timer();
- public MaskLayer()
- {
- timer.Interval = 100;
- timer.Tick += Timer1_Tick;
- timer.Start();
- SetStyle(ControlStyles.UserPaint, true);
- SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
- SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
- alpha = 75;
- //SetStyle(System.Windows.Forms.ControlStyles.Opaque, true);
-
- }
- private void Timer1_Tick(object sender, EventArgs e)
- {
- if (bShow)
- ShowMask(bShow);
- else
- {
- ShowMask(bShow);
- BackgroundImage = null;
- }
-
- }
- private delegate void ShowMaskCallback(Boolean bShow);
- private void ShowMask(Boolean bShow)
- {
- // InvokeRequired需要比较调用线程ID和创建线程ID
- // 如果它们不相同则返回true
- if (this.InvokeRequired)
- {
- ShowMaskCallback d = new ShowMaskCallback(ShowMask);
- this.Invoke(d, new object[] { bShow });
- }
- else
- {
- if (bShow)
- this.Show();
- else
- this.Hide();
- }
- }
- //显示线程
-
- public void DelayShowMaskByScreenCopy(Control parentControl)
- {
- this.BackColor = Color.Black;
- this.Left = 0;
- this.Top = 0;
- this.Width = parentControl.Width;
- this.Height = parentControl.Height;
- this.Parent = parentControl;
- if (this.BackgroundImage == null)
- {
- Rectangle rect = parentControl.ClientRectangle;
- Rectangle sRect = parentControl.RectangleToScreen(rect);
- Bitmap bit = new Bitmap(rect.Width, rect.Height);//实例化一个和窗体一样大的bitmap
- Graphics g = Graphics.FromImage(bit);
- g.CompositingQuality = CompositingQuality.HighQuality;//质量设为最高
- g.CopyFromScreen(sRect.Left, sRect.Top, 0, 0, new Size(this.Width, this.Height));
- this.BackgroundImage = bit;
- }
- bShow = true;
-
- }
- public void DelayShowMaskByColorFill(Color color,Control parentControl)
- {
- this.BackColor = Color.Black;
- this.Left = 0;
- this.Top = 0;
- this.Width = parentControl.Width;
- this.Height = parentControl.Height;
- this.Parent = parentControl;
- SetStyle(ControlStyles.AllPaintingInWmPaint, false); // 擦除背景.有轻微闪烁现象
- if (this.BackgroundImage == null)
- {
- Rectangle rect = parentControl.ClientRectangle;
- Rectangle sRect = parentControl.RectangleToScreen(rect);
- Bitmap bit = new Bitmap(rect.Width, rect.Height);//实例化一个和窗体一样大的bitmap
- Graphics g = Graphics.FromImage(bit);
- g.CompositingQuality = CompositingQuality.HighQuality;//质量设为最高
- g.FillRectangle(new SolidBrush(Color.FromArgb(alpha, color)), this.ClientRectangle);
- this.BackgroundImage = bit;
- }
- bShow = true;
-
- }
- public void DelayHide()
- {
- bShow = false;
-
- }
- protected override void OnPaintBackground(PaintEventArgs e)
- {
- return;
- }
- protected override void OnPaint(PaintEventArgs e)
- {
- Bitmap bmp = new Bitmap(this.Width, this.Height);
- Graphics g = Graphics.FromImage(bmp);
- g.DrawImage(BackgroundImage, 0, 0, this.Width, this.Height);
- Color color = Color.FromArgb(alpha, this.BackColor);
- using (SolidBrush brush = new SolidBrush(color))
- {
- g.FillRectangle(brush, 0, 0, this.Size.Width, this.Size.Height);
- }
- if (!this.DesignMode)
- {
- using (Pen pen = new Pen(color))
- {
- g.DrawRectangle(pen, 0, 0, this.Width, this.Height);
- }
- }
- else
- g.DrawRectangle(Pens.Black, 1, 1, this.Width - 2, this.Height - 2);
-
-
- e.Graphics.DrawImage(bmp, 0, 0);
- g.Dispose();
- bmp.Dispose();
-
- }
-
- protected override CreateParams CreateParams
- {
- get
- {
- const int CS_NOCLOSE = 0x200;
- CreateParams cp = base.CreateParams;
- cp.ExStyle |= 0x00000020;
-
- cp.ClassStyle = cp.ClassStyle | CS_NOCLOSE;
- return cp;
-
- }
- }
-
- public int Alpha
- {
- get
- {
- return alpha;
- }
- set
- {
- if (value < 0) alpha = 0;
- else if (value > 255) alpha = 255;
- else alpha = value;
- this.Invalidate();
- }
- }
-
- }
- }
加延迟是为了防止在两个控件之间切换时,蒙版反复显示,隐藏闪烁。
使用方法:
- MaskLayer maskLayer = new MaskLayer();/****//******/private void ShowMask()
- {
- maskLayer.DelayShowMaskByScreenCopy(panelEx1);//panelEx1是被蒙版的控件。
- }
- private void HideMask()
- {
- maskLayer.DelayHide();
- }