1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Drawing.Drawing2D;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. namespace MyUserControl
  12. {
  13. [ToolboxItem(false), Browsable(false), Description("用于屏蔽用户界面的控件;")]
  14. public partial class MaskLayer : Control
  15. {
  16. private int alpha;
  17. private Boolean bShow = true;
  18. Timer timer = new Timer();
  19. public MaskLayer()
  20. {
  21. timer.Interval = ;
  22. timer.Tick += Timer1_Tick;
  23. timer.Start();
  24. SetStyle(ControlStyles.UserPaint, true);
  25. SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
  26. SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
  27. alpha = ;
  28. //SetStyle(System.Windows.Forms.ControlStyles.Opaque, true);
  29.  
  30. }
  31. private void Timer1_Tick(object sender, EventArgs e)
  32. {
  33. if (bShow)
  34. ShowMask(bShow);
  35. else
  36. {
  37. ShowMask(bShow);
  38. BackgroundImage = null;
  39. }
  40.  
  41. }
  42. private delegate void ShowMaskCallback(Boolean bShow);
  43. private void ShowMask(Boolean bShow)
  44. {
  45. // InvokeRequired需要比较调用线程ID和创建线程ID
  46. // 如果它们不相同则返回true
  47. if (this.InvokeRequired)
  48. {
  49. ShowMaskCallback d = new ShowMaskCallback(ShowMask);
  50. this.Invoke(d, new object[] { bShow });
  51. }
  52. else
  53. {
  54. if (bShow)
  55. this.Show();
  56. else
  57. this.Hide();
  58. }
  59. }
  60. //显示线程
  61.  
  62. public void DelayShowMaskByScreenCopy(Control parentControl)
  63. {
  64. this.BackColor = Color.Black;
  65. this.Left = ;
  66. this.Top = ;
  67. this.Width = parentControl.Width;
  68. this.Height = parentControl.Height;
  69. this.Parent = parentControl;
  70. if (this.BackgroundImage == null)
  71. {
  72. Rectangle rect = parentControl.ClientRectangle;
  73. Rectangle sRect = parentControl.RectangleToScreen(rect);
  74. Bitmap bit = new Bitmap(rect.Width, rect.Height);//实例化一个和窗体一样大的bitmap
  75. Graphics g = Graphics.FromImage(bit);
  76. g.CompositingQuality = CompositingQuality.HighQuality;//质量设为最高
  77. g.CopyFromScreen(sRect.Left, sRect.Top, , , new Size(this.Width, this.Height));
  78. this.BackgroundImage = bit;
  79. }
  80. bShow = true;
  81.  
  82. }
  83. public void DelayShowMaskByColorFill(Color color,Control parentControl)
  84. {
  85. this.BackColor = Color.Black;
  86. this.Left = ;
  87. this.Top = ;
  88. this.Width = parentControl.Width;
  89. this.Height = parentControl.Height;
  90. this.Parent = parentControl;
  91. SetStyle(ControlStyles.AllPaintingInWmPaint, false); // 擦除背景.有轻微闪烁现象
  92. if (this.BackgroundImage == null)
  93. {
  94. Rectangle rect = parentControl.ClientRectangle;
  95. Rectangle sRect = parentControl.RectangleToScreen(rect);
  96. Bitmap bit = new Bitmap(rect.Width, rect.Height);//实例化一个和窗体一样大的bitmap
  97. Graphics g = Graphics.FromImage(bit);
  98. g.CompositingQuality = CompositingQuality.HighQuality;//质量设为最高
  99. g.FillRectangle(new SolidBrush(Color.FromArgb(alpha, color)), this.ClientRectangle);
  100. this.BackgroundImage = bit;
  101. }
  102. bShow = true;
  103.  
  104. }
  105. public void DelayHide()
  106. {
  107. bShow = false;
  108.  
  109. }
  110. protected override void OnPaintBackground(PaintEventArgs e)
  111. {
  112. return;
  113. }
  114. protected override void OnPaint(PaintEventArgs e)
  115. {
  116. Bitmap bmp = new Bitmap(this.Width, this.Height);
  117. Graphics g = Graphics.FromImage(bmp);
  118. g.DrawImage(BackgroundImage, , , this.Width, this.Height);
  119. Color color = Color.FromArgb(alpha, this.BackColor);
  120. using (SolidBrush brush = new SolidBrush(color))
  121. {
  122. g.FillRectangle(brush, , , this.Size.Width, this.Size.Height);
  123. }
  124. if (!this.DesignMode)
  125. {
  126. using (Pen pen = new Pen(color))
  127. {
  128. g.DrawRectangle(pen, , , this.Width, this.Height);
  129. }
  130. }
  131. else
  132. g.DrawRectangle(Pens.Black, , , this.Width - , this.Height - );
  133.  
  134. e.Graphics.DrawImage(bmp, , );
  135. g.Dispose();
  136. bmp.Dispose();
  137.  
  138. }
  139.  
  140. protected override CreateParams CreateParams
  141. {
  142. get
  143. {
  144. const int CS_NOCLOSE = 0x200;
  145. CreateParams cp = base.CreateParams;
  146. cp.ExStyle |= 0x00000020;
  147.  
  148. cp.ClassStyle = cp.ClassStyle | CS_NOCLOSE;
  149. return cp;
  150.  
  151. }
  152. }
  153.  
  154. public int Alpha
  155. {
  156. get
  157. {
  158. return alpha;
  159. }
  160. set
  161. {
  162. if (value < ) alpha = ;
  163. else if (value > ) alpha = ;
  164. else alpha = value;
  165. this.Invalidate();
  166. }
  167. }
  168.  
  169. }
  170. }

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

  1. MaskLayer maskLayer = new MaskLayer();
    /****
    //*****
    */
    private void ShowMask()
  2. {
  3. maskLayer.DelayShowMaskByScreenCopy(panelEx1);//panelEx1是被蒙版的控件。
  4. }
  5. private void HideMask()
  6. {
  7. maskLayer.DelayHide();
  8. }

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. LY tomcat 的闪退问题

    http://www.cnblogs.com/1693977889zz/archive/2018/04/06/8726920.html 在bin文件夹里打开此文件setclasspath.bat 举例 ...

  2. 应用层协议及ip地址划分

    1.应用层协议 2.ip地址 3.子网划分及超网合并

  3. ubuntu python apache2 wsgi django框架

    在ubuntu上通过apatch2和wsgi部署django (亲手做过!!!) 一,我的python.django.apatch2版本: python:python -V 2.7.3 django: ...

  4. jq 事件取消绑定与重新绑定

    前端有时会碰到这样的需求: 点击某个元素发送ajax请求, 发送期间此元素的鼠标相关事件(比如点击)无效, 发送完成鼠标点击事件功能恢复, 对于这种需求, 我们会遇到两种情况, 一种是点击的按钮为fo ...

  5. yield与递归的组合运用

  6. docker --Nexus仓库

    Nexus 简介 Nexus 是个仓库管理器,目前主要分2大版本:2.X 和 3.X.2.X 主要支持的格式是Maven.P2.OBR.Yum.3.X主要支持的是Docker.NuGet.npm.Bo ...

  7. BZOJ4200 NOI2015小园丁与老司机(动态规划+上下界网络流)

    一看上去就是一个二合一的题.那么先解决第一部分求最优路线(及所有可能在最优路线上的线段). 由于不能往下走,可以以y坐标作为阶段.对于y坐标不同的点,我们将可以直接到达的两点连边,显然这样的边的个数是 ...

  8. File类总结

    1.File类是描述文件或文件夹的.File类可以用来操作文件或文件夹本身.但它不能操作文件中的数据. File( String name  )  把一个字符串封装成File对象.这个字符串可以是文件 ...

  9. 自学Linux Shell11.5-执行数字运算

    点击返回 自学Linux命令行与Shell脚本之路 11.5-执行数字运算 1. Shell基本运算符 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符 ...

  10. 【ZJOI 2019】麻将(dp of dp)

    这是我第一次写$dp \; of \; dp$,大致思路参考了xyx的做法,可能有些地方不太一样,但也许会详细一点. 考虑给你一副牌,如何判断这副牌是否是胡的. 容易发现相同的顺子不会选三个以上,于是 ...