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 = ;
timer.Tick += Timer1_Tick;
timer.Start();
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
alpha = ;
//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 = ;
this.Top = ;
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, , , new Size(this.Width, this.Height));
this.BackgroundImage = bit;
}
bShow = true; }
public void DelayShowMaskByColorFill(Color color,Control parentControl)
{
this.BackColor = Color.Black;
this.Left = ;
this.Top = ;
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, , , this.Width, this.Height);
Color color = Color.FromArgb(alpha, this.BackColor);
using (SolidBrush brush = new SolidBrush(color))
{
g.FillRectangle(brush, , , this.Size.Width, this.Size.Height);
}
if (!this.DesignMode)
{
using (Pen pen = new Pen(color))
{
g.DrawRectangle(pen, , , this.Width, this.Height);
}
}
else
g.DrawRectangle(Pens.Black, , , this.Width - , this.Height - ); e.Graphics.DrawImage(bmp, , );
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 < ) alpha = ;
else if (value > ) alpha = ;
else alpha = value;
this.Invalidate();
}
} }
}

加延迟是为了防止在两个控件之间切换时,蒙版反复显示,隐藏闪烁。
使用方法:

MaskLayer maskLayer = new MaskLayer();
/****
//*****
*/
private void ShowMask()
{
maskLayer.DelayShowMaskByScreenCopy(panelEx1);//panelEx1是被蒙版的控件。
}
private void HideMask()
{
maskLayer.DelayHide();
}

C#自绘蒙版控件,带延时隐藏显示,拷贝底图功能的更多相关文章

  1. 自行实现透明的控件如Panel GroupBox(使用不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT属性)

    CSDN的Blog开通了.我想这里的Blog作为今后自己回答别人问题的时候,收藏答案的地方很不错呢. 因为社区的贴子早晚都会沉下去,查找起来很不方便,甚至再也找不到呢. Q: http://commu ...

  2. 重绘MenuStrip 控件

    重绘MenuStrip控件 效果如图: 首先添加 CustomProfessionalRenderer类 用于重绘控件菜单样式 /// <summary> /// 自定义MenuStrip ...

  3. 自定义两个控件,一个是显示图标和文字的矩形,一个是带边框的label(但是不是label)

    记录遇到的两个坑 坑1. 一开始我继承button 来实现下面的控件1,后面发现button没有双击事件.就改成继承UserControl了.重新编译,导致设计时的控件文本全部被清空,因为UserCo ...

  4. VB.NET设置控件和窗体的显示级别

    前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示. 这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显 ...

  5. ListView控件的Insert、Edit和Delete功能(第一部分)

    摘自:http://blog.ashchan.com/archive/2007/08/28/listview-control-insert-edit-amp-delete-part-1aspx/ Li ...

  6. Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)

    PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包.PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法.同时它也是一个可以在几乎所有主流 ...

  7. CAD控件界面显示与隐藏(网页版)

    控件界面工具栏的显示或隐藏,js代码实现如下: 1 2 3 4 5 6 7 8 9 //隐藏/显示工具栏       mxOcx.ShowToolBar("常用工具",isShow ...

  8. 重绘panel控件,实现panel的阴影效果

    最近想在项目中添加一个要有阴影的panel控件,找了好多资料,最后通过采用图片的方式实现了panel的阴影效果,效果图如下: 重绘代码如下: using System; using System.Co ...

  9. 自绘Tab控件

    自绘tab按钮效果图如下: 使用例子: MyTabControl *tabControl = NULL; tabControl = new MyTabControl();tabControl-> ...

随机推荐

  1. jQuery 簡介

    jQuery:是一個js庫,可以極大地簡化編程,“寫得少做得多”. jquery的作用: 挑選元素.操作屬性.事件函數.動畫和效果.ajax: jQuery庫:google和microsoft都支持, ...

  2. spring cloud实战与思考(五) JWT之携带敏感信息

    需求: 需要将一些敏感信息保存在JWT中,以便提高业务处理效率. 众所周知JWT协议RFC7519使用Base64Url对Header和Payload的Json字符串进行编解码.A JWT is re ...

  3. selenium之下载

    # 测试下载功能,保存文件到指定的目录 # 不同的浏览器配置是不同的,本例使用chrome浏览器 # author:gongxr # date:2017-07-25 import time from ...

  4. 学习笔记之csrf

    CBV 添加 csrf 第一种: 指定方法方面添加 装饰器 @memethod_decorator(xxx) 第二种 全部添加: 注意 在类名前: @method_decorator(xxx,name ...

  5. codeforces548B

    Mike and Fun CodeForces - 548B Mike and some bears are playing a game just for fun. Mike is the judg ...

  6. Nginx PREACCESS阶段 如何限制每个客户端的并发连接数

    L:55 nginx.conf配置文件列子 limit_conn_zone $binary_remote_addr zone=addr:10m; #这里根据用户IP地址作为key做限制 并且名称为ad ...

  7. BZOJ3523[Poi2014]Bricks——贪心+堆

    题目描述 有n种颜色的砖块,第i种颜色的砖块有a[i]个,你需要把他们放成一排,使得相邻两个砖块的颜色不相同,限定第一个砖块的颜色是start,最后一个砖块的颜色是end,请构造出一种合法的方案或判断 ...

  8. BZOJ3676 APIO2014回文串(manacher+后缀自动机)

    由于本质不同的回文子串数量是O(n)的,考虑在对于每个回文子串在第一次找到它时对其暴力统计.可以发现manacher时若右端点移动则找到了一个新回文串.注意这样会漏掉串长为1的情况,特判一下. 现在问 ...

  9. bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 思路: splay树模板题: 推荐博客:https://blog.csdn.ne ...

  10. emwin之窗口关闭按钮用法

    @2018-07-27 [小记] 使用函数 FRAMEWIN_AddCloseButton() 实现关闭当前窗口的功能时,调用其窗口的父窗口必须处于打开状态,否则将导致假死(当前窗口死了,系统还在工作 ...