在C#Winform开发中,通常将checkbox当做开关控件,但是是不是觉得很丑呢?这里给大家分享一个我自己原创的winform开关控件,先上个图吧。

怎么样,用这个代替checkbox,你的程序应该会瞬间上一个档次。
直接进入代码吧。
首先,创建一个类,这个类就是开关控件类。取名UC_Switch,继承PictureBox(因为它本质上就是一个图片元素)。

    /// <summary>/// 开关控件/// author:hyq/// e-mail:huangyq1984@qq.com/// </summary>public partial class UC_Switch : PictureBox{public UC_Switch() : base(){this.Height = 25; this.Width = 80;this.BackColor = Color.Transparent;//设置默认关闭状态SetState(0, false);//点击事件this.Click += new EventHandler((sender, e) =>{//判断是否允许修改状态bool canChange = true;if (allowChangeState != null)canChange = allowChangeState();//如果允许修改,则修改当前状态if (canChange){SetState(curState == 0?1:0, true);}});}/// <summary>/// 当前状态,默认关闭/// </summary>private int curState = 0;/// <summary>/// 判断是否允许修改状态,由外部去实现(可实现也可不实现,不实现时默认允许修改)/// </summary>public Func<bool> allowChangeState { get; set; }/// <summary>/// 状态发生变化时的回调Action/// </summary>public Action stateChanged { get; set; }/// <summary>/// 是否是打开状态/// </summary>public bool Opened { get { return curState == 1; } }/// <summary>/// 打开开关,不触发事件/// </summary>public void Open(){SetState(1, false);}/// <summary>/// 关闭开关,不触发事件/// </summary>public void Close(){SetState(0, false);}/// <summary>/// 设置开关状态,并选择是否触发事件/// </summary>/// <param name="state">0-关闭,1-开启</param>/// <param name="trrigerChangedEvent">是否触发事件</param>public void SetState(int state, bool trrigerChangedEvent){Image img = PaintSwitchImage(state);this.Image = GetImageToFitPictureBox(this, img, "", Color.Transparent);curState = state;if (trrigerChangedEvent){stateChanged?.Invoke();}}        }

上面代码中的PaintSwitchImage方法,是根据开关状态绘制图片,GetImageToFitPictureBox方法,是根据PictureBox的尺寸调整图片大小,但不改变图片长宽比例。因为代码篇幅较长,这里没有把这两个方法贴出来,下面只讲解一下思路及部分代码。
PaintSwitchImage要用到GDI绘图,主要用到Bitmap、Graphics、Pen、Brush、Rectangle等类。首先创建一个Bitmap、Graphics对象,注意设置Graphics属性。

//封装一个 GDI+ 绘图图面
Graphics g = Graphics.FromImage(bm);
g.SmoothingMode = SmoothingMode.AntiAlias;  //使绘图质量最高,即消除锯齿
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.CompositingQuality = CompositingQuality.HighQuality;

仔细观察开关控件的图片,我们可以把开关控件分为左中右3个部分,左右两边是一个圆形,中间是一个长方形,两个圆形的一半都叠加在长方形中,这样可以使用Pen画出部分叠加的左右两个圆及中间的长方形。

//画笔,左右两个圆圈及中间一个长方形
Pen p = new Pen(Color.LightGray);
g.DrawEllipse(p, new Rectangle(0, 0, 30, 30));
g.DrawEllipse(p, new Rectangle(50, 0, 30, 30));
g.DrawRectangle(p, new Rectangle(15, 0, 50, 30));

然后用画刷Brush(为了美观,我们使用线性渐变画刷LinearGradientBrush),根据当前开关状态state,填充图形内部颜色。
最后,还要填写 on 或 off 字样,并且在旁边画出一个小圆,这里我们用SolidBrush。注意,开关状态不同,字符和小圆的位置及颜色都不同。

//填写字符,on/off
Brush b = new SolidBrush(state == 0 ? Color.Gray : Color.White);
System.Drawing.Font f = new System.Drawing.Font("微软雅黑", 12, FontStyle.Regular);
if (state == 0)
{g.FillEllipse(b, new Rectangle(3, 3, 24, 24));g.DrawString("OFF", f, b, 32, 5);
}
else
{g.FillEllipse(b, new Rectangle(51, 3, 24, 24));g.DrawString("ON", f, b, 12, 5);
}

另外,GetImageToFitPictureBox方法,只是在不改变长宽比例的前提下根据PictureBox的尺寸调整图片大小,主要考验小学数学知识,代码就不贴出来了。
除了显示 “on/off” ,只要稍作修改就可以改变控件的含义,例如 “是/否”、“打开/关闭”、“有效/无效”等等。
若感兴趣可下载完整源码。
下载源码

原创C#Winform桌面应用中实用又美观的开关控件源码分享相关推荐

  1. Web 开发中很实用的10个效果【附源码下载】

    在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...

  2. linux中terminal中编译源码,分享|Terminator:一款一个窗口包含多个终端的 Linux 终端仿真器...

    为了通过命令行和系统互动,每一款 Linux 发行版都有一款默认的终端仿真器.但是,默认的终端应用可能不适合你.为了大幅提升你工作的速度,有好多款终端应用提供了更多的功能,可以同时执行更多的任务.这些 ...

  3. 超酷实用的jQuery焦点图赏析及源码

    超酷实用的jQuery焦点图赏析及源码 焦点图应用在现代网页中使用十分广泛,有注重简单小巧的,也有注重华丽美观的,大部分jQuery焦点图都可以滑动和切换图片,并且在切换图片时产生不同的动画特效.今天 ...

  4. 在DWZ框架中整合kindeditor复文本框控件

    今天上午在DWZ框架中整合kindeditor复文本框控件,发现上传图片是老是提示 "上传中,请稍候...",上网查看别人说可能是文件路径问题,在想以前在其他项目中用这个控件一直没 ...

  5. java中的string函数_java中string.trim()函数的作用实例及源码

    trim()的作用:去掉字符串首尾的空格. public static void main(String arg[]){ String a=" hello world "; Str ...

  6. python删除链表中重复的节点_Java编程删除链表中重复的节点问题解决思路及源码分享...

    一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4-&g ...

  7. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

  8. [html] 怎样去除iOS和Android中的输入URL地址的控件条呢?

    [html] 怎样去除iOS和Android中的输入URL地址的控件条呢? setTimeout(scrollTo,0,0,0); 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚 ...

  9. java中trim_java中string.trim()函数的作用实例及源码

    trim()的作用:去掉字符串首尾的空格. public static void main(String arg[]){ String a=" hello world "; Str ...

  10. qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示

    ---恢复内容开始--- qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示 打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分, ...

最新文章

  1. Sqoop的基础应用
  2. 在电脑桌面怎样用命令开启远程桌面?
  3. docker mysql映射端口映射_docker的简单操作和端口映射
  4. 设置oracle 随机启动,配置Oracle单实例随机启动(11gR2)
  5. Java私有方法运用场景_java6-3 封装和private关键字
  6. 世界第一台电脑_2020世界计算机大会今日开幕 给市民带来全方位观展体验 - 三湘万象 - 湖南在线...
  7. u8薪资管理_用友U8习题集
  8. JavaWEB过滤器和监听器技术
  9. 为什么你拼命学,却一无所成?
  10. MCU加密技术分析(二)
  11. 电梯设计需求调研报告
  12. Canvas beginPath()、moveTo()、 lineTo() 、stroke() 绘制直线路径,fillText() 绘制填色的文本
  13. Django 学习笔记(五) --- Ajax 传输数据
  14. mysql select 返回列_mySQL – 使用select返回多行来更新多个列
  15. 学完这个PPT设计课程后,我实现了月入3w+!
  16. UNIX 网络编程课程目录
  17. arcgis之图斑椭球面积及净面积计算工具
  18. 工具网站:10个国外免费、无版权、高清图片素材站
  19. 数据挖掘 顶级期刊_SEER数据挖掘如果用上这些图会更好发
  20. Siammask源码demo运行配置

热门文章

  1. 台式计算机cpu扣不下去,台式电脑CPU反应太慢了!是怎么回事导致?有什么方法解决?...
  2. 《郭论—捡史》郭德纲/著 读后得
  3. facebook 登陆失败 分享失败 原因汇总
  4. 【ROS】launch文件详解
  5. 将中划线转为驼峰式写法
  6. Android——Intent总结
  7. 信捷用c语言编写梯形图,PLC一键启停编程梯形图实例
  8. 机器学习小白入门--统计学知识 Z-Value for Proportions
  9. 看着现在的勒布朗·詹姆斯,让人再次回想起篮球之神——伟大的迈克尔·乔丹和他的最佳搭档——斯科蒂·皮蓬
  10. 利用C#进行CAD二次开发