在完成“个人电脑使用记录清除软件”中,我设计的winform界面需要应用到类似于"360安全卫士"的透明罩效果,文章主要引述了如何使用自定义组件MyOpaqueLayer,并自定义类OpaqueCommand中定义显示透明罩函数ShowOpaqueLayer和隐藏透明罩函数HideOpaqueLayer实现,同时如何对控件添加透明罩及遇到的问题.

一.自定义透明罩MyOpaqueLayer组件

(声明:此段代码引用自海华博客http://www.cnblogs.com/JuneZhang/archive/2012/07/06/2579215.html)
在添加透明罩控件\组件时,我的想法是"右键项目->添加->添加控件",但添加没有成功,在网上也没有讲到该添加的基础方法,由于以前也没遇到过自定义控件的问题,所以只好采取的方法是拖拽修改过MyOpaqueLayer.cs文件至项目中,具体代码如下(含详细注释):

using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;namespace MyOpaqueLayer
{/* * [ToolboxBitmap(typeof(MyOpaqueLayer))]* 用于指定当把你做好的自定义控件添加到工具栏时,工具栏显示的图标。* 正确写法应该是* [ToolboxBitmap(typeof(XXXXControl),"xxx.bmp")]* 其中XXXXControl是你的自定义控件,"xxx.bmp"是你要用的图标名称。*/[ToolboxBitmap(typeof(MyOpaqueLayer))]/// <summary>/// 自定义控件:透明罩控件(继承Control)/// </summary>public class MyOpaqueLayer : System.Windows.Forms.Control{private bool _transparentBG = true;       //是否使用透明private int _alpha = 125;                 //设置透明度private System.ComponentModel.Container components = new System.ComponentModel.Container();public MyOpaqueLayer(): this(125, true){}public MyOpaqueLayer(int Alpha, bool IsShowLoadingImage){SetStyle(System.Windows.Forms.ControlStyles.Opaque, true);  //设置控件样式base.CreateControl();                                       //创建控件this._alpha = Alpha;//放置加载进度的图片代码此处被省略}//释放组件占用内存protected override void Dispose(bool disposing)                 {if (disposing){if (!((components == null))){components.Dispose();}}base.Dispose(disposing);}/// <summary>/// 自定义绘制窗体/// </summary>/// <param name="e"></param>protected override void OnPaint(System.Windows.Forms.PaintEventArgs e){float vlblControlWidth;float vlblControlHeight;Pen labelBorderPen;                     //定义PenSolidBrush labelBackColorBrush;         //定义单色画笔if (_transparentBG)                     //使用透明{Color drawColor = Color.FromArgb(this._alpha, this.BackColor);labelBorderPen = new Pen(drawColor, 0);labelBackColorBrush = new SolidBrush(drawColor);}else{labelBorderPen = new Pen(this.BackColor, 0);labelBackColorBrush = new SolidBrush(this.BackColor);}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;  //扩展派生类CreateParams属性cp.ExStyle |= 0x00000020;             //开启WS_EX_TRANSPARENT,使控件支持透明return cp;}}/** [Category("myOpaqueLayer"), Description("是否使用透明,默认为True")]* 一般用于说明你自定义控件的属性(Property)* Category用于说明该属性属于哪个分类,Description自然就是该属性的含义解释。*/[Category("MyOpaqueLayer"), Description("是否使用透明,默认为True")]public bool TransparentBG{get{return _transparentBG;}set{_transparentBG = value;this.Invalidate();}}//设置透明度[Category("MyOpaqueLayer"), Description("设置透明度")]public int Alpha{get{return _alpha;}set{_alpha = value;this.Invalidate();}}//初始化窗体private void InitializeComponent(){this.SuspendLayout();      //临时挂起控件的布局逻辑,它与ResumeLayout()配合使用this.ResumeLayout(false);  //恢复正常逻辑}}
}

二.自定义透明罩类OpaqueCommand

在第一部分我们已经自定义透明罩组件,此时需要自定义类OpaqueCommand并调用其方法ShowOpaqueLayer(显示遮罩层)和HideOpaqueLayer(隐藏遮罩层).可以在“解决方法”中右键项目名->添加->类,具体代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace EMSecure
{class OpaqueCommand{//透明罩private MyOpaqueLayer.MyOpaqueLayer m_OpaqueLayer = null;/// <summary>/// 显示透明层/// </summary>/// <param name="control">控件</param>/// <param name="alpha">透明度</param>/// <param name="isShowLoadingImage">是否显示图标</param>public void ShowOpaqueLayer(Control control, int alpha, bool isShowLoadingImage){try{if (this.m_OpaqueLayer == null){this.m_OpaqueLayer = new MyOpaqueLayer.MyOpaqueLayer(alpha, isShowLoadingImage);control.Controls.Add(this.m_OpaqueLayer);this.m_OpaqueLayer.Dock = DockStyle.Fill;this.m_OpaqueLayer.BringToFront();}this.m_OpaqueLayer.Enabled = true;this.m_OpaqueLayer.Visible = true;}catch (Exception msg)              //异常处理{MessageBox.Show(msg.Message);}}/// <summary>/// 隐藏透明层/// </summary>public void HideOpaqueLayer(){try{if (this.m_OpaqueLayer != null){this.m_OpaqueLayer.Visible = false;this.m_OpaqueLayer.Enabled = false;}}catch (Exception msg)             //异常处理{MessageBox.Show(msg.Message);}}}
}

三.使用透明罩

在定义透明罩控件和类后,如何实现该界面的效果,我推荐的方法是:
1.设置toolBar控件,在items(集合)中添加相应的图标\文字构成不同的ToolItem,每次透明罩遮掩不同的Item即可,如果是wfp使用TabControl\TabItem.但由于toolBar被toolStrip替代,不太会使用该控件,但仍然推荐该方法(有的没有定义透明罩控件,而是通过3张透明程度不同的图,设置可见属性实现该效果).运行结果:

2.在代码设计器Form中添加MyOpaqueLayer控件,此时就能看见6个透明罩的MyOpaqueLayer控件,该方法不需要设置自定义类OpaqueCommand调用其方法,而是设置如下代码:

//鼠标离开
private void myOpaqueLayer1_MouseLeave(object sender, EventArgs e)
{this.myOpaqueLayer1.Visible = false;this.label4.ForeColor = Color.White;
}
//鼠标进入
private void pictureBox1_MouseEnter(object sender, EventArgs e)
{this.myOpaqueLayer1.Visible = true;this.label4.ForeColor = Color.Yellow;
}

设计器中form如下图所示:

但由于不知道如何添加该控件拖动至设计器中,所以我采取的方法是
3.自定义6个panel,通过鼠标事件进入panelmol1_MouseEnter(object sender, EventArgs e)\鼠标离开事件panelmol1_MouseLeave(object sender, EventArgs e)\鼠标点击事件panelmol1_MouseClick(object sender, EventArgs e)实现,最后我的运行结果如下图所示:

下面只给出使用透明罩控件和类的基本调用代码并省略Click部分(因为做的不是很好),请读者体会与自己设计:

//自定义类OpaqueCommand
OpaqueCommand cmd = new OpaqueCommand();
//定义点击panel时透明罩情况
bool isClick = false;//鼠标进入"清除IE"
private void panel_mol1_MouseEnter(object sender, EventArgs e)
{//透明罩设置 没点击才取消透明罩cmd.ShowOpaqueLayer(panel_mol1, 125, true);
}
private void panel_mol1_MouseEnter(object sender, EventArgs e)
{cmd.HideOpaqueLayer();
}

四.总结
个人感觉该设计还有很多地方需要自己改进,同时想实现ToolBar方法和了解如何添加自定义组件而不是拖拽,期望自己能解决这些问题.希望该文章对大家有所帮助,同时感谢下面3篇文章及博主,是讲述透明罩和如何自定义控件的文章,个人感觉非常不错.如果文章中有不足或错误的地方,请海涵!
(By:Eastmount 2014-3-10 中午2点 原创:http://blog.csdn.net/eastmount)
参考资料及在线笔记:
1.C#实现Winform自定义半透明遮罩层-海华(主要参考透明罩的设定)

http://www.cnblogs.com/JuneZhang/archive/2012/07/06/2579215.html
2.C#中自定义控件-杨友山(自定义控件简述)
http://blog.csdn.net/yysyangyangyangshan/article/details/7078471
3.C#自定义控件开发-百度文库(详细介绍自定义控件\复合控件\扩展控件)
http://wenku.baidu.com/view/89a47f6e58fafab069dc02bf.html

C# 系统应用之透明罩MyOpaqueLayer实现360界面阴影效果相关推荐

  1. windows电脑制作mac os u盘重装系统_为什么不建议用360重装系统 请耐心等待几分钟...

    谈到重装系统,我们很多人都了解,有朋友问为什么不建议用360重装系统,当然了,还有朋友想问360重装大师可以选择系统吗,这到底是咋回事?其实360安全卫士里的系统重装好吗,今天小编给大家整理了为什么不 ...

  2. python拿什么做可视化界面好-用python打造可视化爬虫监控系统,酷炫的图形化界面...

    原标题:用python打造可视化爬虫监控系统,酷炫的图形化界面 本文并不是讲解爬虫的相关技术实现的,而是从实用性的角度,将抓取并存入 MongoDB 的数据 用 InfluxDB 进行处理,而后又通过 ...

  3. android界面布局题,【填空题】Android 系统中, 用于定义布局显示在界面上的风格。...

    [填空题]Android 系统中, 用于定义布局显示在界面上的风格. 更多相关问题 [37]A.anotherB.each otherC.the otherD.one another Tabor ma ...

  4. NET快速信息化系统开发框架 V3.2 - “用户管理”主界面使用多表头展示、增加打印功能...

    NET快速信息化系统开发框架 V3.2 -> "用户管理"主界面使用多表头展示.增加打印功能 RDIFrameowrk.NET 用户管理是使用非常频繁的模块,由于需要展示的字 ...

  5. win10子系统ubuntu图形界面_win10系统中安装ubuntu子系统及图形界面

    作为全球最流行且最有影响力的Linux开源系统之一,Ubuntu自发布以来在应用体验方面:有较大幅度的提升,即使对比Windows.MacoS等操作系统,最新版本的Ubuntu也不逊色.下面教大家在w ...

  6. 生鲜配送ERP系统_对商品模块数据模型与界面设计的思考【Java 开源版】杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝

    生鲜配送ERP系统_对商品模块数据模型与界面设计的思考及简要分析[Java 开源版]杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝 一直在研究与改造自己的生鲜配送系统,越来越觉得后 ...

  7. 计算机开机选择用户界面,win7系统每次开机都会出现选择操作系统界面的设置办法...

    win7系统使用久了,好多网友反馈说win7系统每次开机都会出现选择操作系统界面的问题,非常不方便.有什么办法可以永久解决win7系统每次开机都会出现选择操作系统界面的问题,面对win7系统每次开机都 ...

  8. 常规功能和模块自定义系统 (cfcmms)—013给Extjs6加入多界面主题(Theme)

    常规功能和模块自定义系统 (cfcmms)-013给Extjs6加入多界面主题(Theme) 在用sencha命令创建的Extjs6项目中只能使用一种界面主题(Theme),如果要换一个界面风络需要重 ...

  9. 人脸表情识别系统的设计与实现(含UI界面,有完整代码)

    人脸表情识别系统的设计与实现(含UI界面,有完整代码) 这是之前本科做的毕设,当时使用的是keras搭建了一个简单的神经网络作为入门实现了在fer2013人脸表情数据集上的表情分类,并移植到了树莓派上 ...

最新文章

  1. python面试-Python面试题(整理)
  2. 线性时间排序--桶排
  3. G. Xor-MST(异或最小生成树)
  4. 【LeetCode笔记】78. 子集(Java、dfs)
  5. HTML+CSS+JS实现 ❤️ 团队人物图片蜂巢布局❤️
  6. struts2中Action名称的搜索顺序
  7. jsp不能使用return时候,如何在出异常时退出,不在向下执行
  8. MySQL数据库---(1)win10 免安装MySQL 教程
  9. LeetCode--056--合并区间(java)
  10. java高级工程师认证考试_Java高级工程师必备知识
  11. MQL5 信号的优势
  12. 保乐力加在四川峨眉山兴建中国首家麦芽威士忌酒厂
  13. 加密算法(国密算法)
  14. 微信小程序:UI好看的王者荣耀战力查询助手小程序源码
  15. iphone13开箱验机全步骤
  16. 解决对话框的圆角背景图片黑色部分
  17. 电梯控制系统的设计与实现
  18. python24小时12小时转换_Python上24小时时间转换为12小时制(ProblemSetQuestion)
  19. R语言计算KS值、绘制KS曲线
  20. 图像编码与 H264 基础知识

热门文章

  1. vertx.FileResolver文件解析
  2. Android Studio快捷键之代码提示
  3. MongoDB在Windows系统下的安装和启动
  4. 如何一步一步用DDD设计一个电商网站(十三)—— 领域事件扩展
  5. 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
  6. Android怎么实现选课功能,选课系统android
  7. 微信小程序css3动画怎么写,微信小程序动画课程-通过wxss(css)来实现-animation 属性...
  8. python爬虫提取a标签_Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
  9. python自学笔记之开源小工具:SanicDB介绍
  10. VirtualBox中的Linux读取Windows共享目录