场景

效果

注:

博客主页:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

新建一个用户控件TransparencyButton,修改其代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;namespace 自定义水晶按钮控件
{public partial class TransparencyButton : UserControl{public TransparencyButton(){InitializeComponent();}#region 公共变量public static SmoothingMode sm;public static bool pub_ButtonClick = true;//判断按钮是否按下(false为按下)public static int pub_Degree = 0;//记录四角弧度的大小范围public static int pub_RGB_r0 = 0x130;//按钮背景的R色值public static int pub_RGB_r1 = 0x99;//按钮其它颜色的R色值#endregion#region 添加属性private string BNText = "";[Browsable(true), Category("透明按钮的属性设置"), Description("设置显示的文本")]   //在“属性”窗口中显示NText属性public string NText{get { return BNText; }set{BNText = value;if (BNText.Length > 0)Invalidate();}}private int BDegree = 1;[Browsable(true), Category("透明按钮的属性设置"), Description("设置按钮四个角的弧度")]   //在“属性”窗口中显示Degree属性public int Degree{get { return BDegree; }set{BDegree = value;if (this.Width >= this.Height)pub_Degree = (int)(this.Height / 2);elsepub_Degree = (int)(this.Width / 2);if (BDegree <= 0)BDegree = 1;if (BDegree > pub_Degree)BDegree = pub_Degree;if (BDegree > 0)Invalidate();}}private Color DShineColor = Color.Black;[Browsable(true), Category("透明按钮的属性设置"), Description("设置按钮的光泽度颜色")]   //在“属性”窗口中显示ShineColor属性public Color ShineColor{get { return DShineColor; }set{DShineColor = value;Invalidate();}}private Color DUndersideShine = Color.LightGray;[Browsable(true), Category("透明按钮的属性设置"), Description("设置按钮的下部的光泽度")]   //在“属性”窗口中显示UndersideShine属性public Color UndersideShine{get { return DUndersideShine; }set{DUndersideShine = value;Invalidate();}}private int DCTransparence = 0;[Browsable(true), Category("透明按钮的属性设置"), Description("设置按钮的透明度数")]   //在“属性”窗口中显示CTransparence属性public int CTransparence{get { return DCTransparence; }set{DCTransparence = value;if (DCTransparence > 20)DCTransparence = 20;if (DCTransparence < 0)DCTransparence = 0;if (DCTransparence >= 0)Invalidate();}}private int DCFontDeepness = 1;[Browsable(true), Category("透明按钮的属性设置"), Description("设置按钮文本的深度")]   //在“属性”窗口中显示CFontDeepness属性public int CFontDeepness{get { return DCFontDeepness; }set{DCFontDeepness = value;if (DCFontDeepness > 20)DCFontDeepness = 20;if (DCFontDeepness < 0)DCFontDeepness = 0;if (DCFontDeepness >= 0)Invalidate();}}#endregion#region 事件private void TransparencyButton_Paint(object sender, PaintEventArgs e){this.BackColor = Color.Transparent;//使当前控件透明sm = e.Graphics.SmoothingMode;//设置呈现质量Color shineColor = Color.Black;Rectangle rect2 = new Rectangle(0, 0, this.Width, this.Height);//设置绘制按钮的矩形区域Rectangle rect1 = new Rectangle(0, this.Height / 2, this.Width, this.Height / 2);//设置绘制按钮下半部的矩形区域if (this.CTransparence == 0)//如果按钮的透明度为0{CobOblongDown(rect2, e.Graphics);//绘制按扭的背景CobOblong(rect2, e.Graphics, this.ShineColor);//绘制按扭的背景}else{if (this.CTransparence > 0)//如果按钮的透明度不为0{CobOblongDown(rect2, e.Graphics);//绘制按扭的背景for (int i = 0; i < CTransparence; i++){CobOblong(rect2, e.Graphics, this.ShineColor);//绘制按扭的背景颜色}}}int tem_n = (int)(this.CTransparence / 3);//获取一个值,用于设置下半部按钮的颜色深度if (tem_n == 0)//如果为0CobAjar(rect1, e.Graphics, this.ShineColor);//绘制按扭的下半部背景else{if (tem_n > 0)//如果不为0{for (int i = 0; i < tem_n; i++)//加深下部按钮的颜色{CobAjar(rect1, e.Graphics, this.ShineColor);//绘制按扭的下半部背景颜色}}}CobOblong(rect2, e.Graphics, this.UndersideShine);//设置下半部按钮的光泽度if (pub_ButtonClick == false)//判断按钮是否按下(false为按下){CobOblongDown(rect2, e.Graphics);//绘制按扭的背景}if (this.NText.Length > 0)//如果Text属性中有值ProtractText(e.Graphics);//绘制透明按钮的文本信息}private void TransparencyButton_SizeChanged(object sender, EventArgs e){Invalidate();//对控件进行重绘}private void TransparencyButton_MouseDown(object sender, MouseEventArgs e){pub_ButtonClick = false;//按下按钮Invalidate();//对控件进行重绘}private void TransparencyButton_MouseUp(object sender, MouseEventArgs e){pub_ButtonClick = true;//松开按钮Invalidate();//对控件进行重绘}#endregion#region 自定义方法/// <summary>/// 绘制透明按扭的文本/// </summary>/// <param g="Graphics">封装一个绘图的类对象</param>private void ProtractText(Graphics g){Graphics TitG = this.CreateGraphics();//创建Graphics类对象string TitS = this.NText;//获取图表标题的名称SizeF TitSize = TitG.MeasureString(TitS, this.Font);//将绘制的字符串进行格式化float TitWidth = TitSize.Width;//获取字符串的宽度float TitHeight = TitSize.Height;//获取字符串的高度float TitX = 0;//标题的横向坐标float TitY = 0;//标题的纵向坐标if (this.Height > TitHeight)//如果按钮的高度大于文本的高度TitY = (this.Height - TitHeight) / 2;//使文本水平方向局中elseTitY = this.BDegree;//文本置顶if (this.Width > TitWidth)//如果按钮的宽度大于文本的宽度TitX = (this.Width - TitWidth) / 2;//使文本水平局中elseTitX = this.BDegree;//文本置左//设置文本的绘制区域Rectangle rect = new Rectangle((int)Math.Floor(TitX), (int)Math.Floor(TitY), (int)Math.Ceiling(TitWidth), (int)Math.Ceiling(TitHeight));int opacity = pub_RGB_r1;//设置R色值opacity = (int)(.4f * opacity + .5f);//设置渐变值for (int i = 0; i < DCFontDeepness; i++)//设置文本的深度{//设置文本的渐变颜色using (LinearGradientBrush br = new LinearGradientBrush(rect, Color.FromArgb(opacity, this.ForeColor), Color.FromArgb(opacity, this.ForeColor), LinearGradientMode.Vertical)){g.DrawString(TitS, this.Font, br, new PointF(TitX, TitY));//绘制带有渐变效果的文本}}}/// <summary>/// 绘制透明按扭的背景色/// </summary>/// <param rect="Rectangle">绘制按钮的区域</param>/// <param g="Graphics">封装一个绘图的类对象</param>/// <param fillColor="Color">填充的颜色</param>private void CobOblong(Rectangle rect, Graphics g, Color fillColor){using (GraphicsPath bh = CreateCobOblong(rect, this.BDegree))//绘制一个圆角矩形{int opacity = pub_RGB_r0;//设置按钮的R色值opacity = (int)(.4f * opacity + .5f);//设置渐变的变化值//设置按钮的渐变颜色using (LinearGradientBrush br = new LinearGradientBrush(rect, Color.FromArgb(opacity / 5, fillColor), Color.FromArgb(opacity, fillColor), LinearGradientMode.Vertical)){g.FillPath(br, bh);//填充按钮背景}g.SmoothingMode = sm;//设置呈现的质量}}/// <summary>/// 绘制透明按扭的下半部背景色/// </summary>/// <param rect="Rectangle">绘制按钮的下半部区域</param>/// <param g="Graphics">封装一个绘图的类对象</param>/// <param fillColor="Color">填充的颜色</param>private void CobAjar(Rectangle rect, Graphics g, Color fillColor){using (GraphicsPath bh = CreateCobAjar(rect, this.BDegree)){int opacity = pub_RGB_r1;opacity = (int)(.4f * opacity + .5f);using (LinearGradientBrush br = new LinearGradientBrush(rect, Color.FromArgb(opacity, fillColor), Color.FromArgb(pub_RGB_r1 / 5, fillColor), LinearGradientMode.Vertical)){g.FillPath(br, bh);//填充按钮背景}g.SmoothingMode = sm;//设置呈现的质量}}/// <summary>/// 绘制透明按扭按下时的效果/// </summary>/// <param rect="Rectangle">绘制按钮的区域</param>/// <param g="Graphics">封装一个绘图的类对象</param>private void CobOblongDown(Rectangle rect, Graphics g){using (GraphicsPath bh = CreateCobOblong(rect, this.BDegree))//按钮的圆角绘制{int opacity = pub_RGB_r1;//设置按钮的R色值Color tem_Color = Color.Black;//设置按钮的背景颜色为黑色if (pub_ButtonClick == true)//如果按钮没有按下{opacity = pub_RGB_r0;//设置按钮的R色值tem_Color = Color.White;//设置按钮的背景颜色为白色}opacity = (int)(.4f * opacity + .5f);//设置渐变的变化值//设置按钮的渐变颜色using (LinearGradientBrush br = new LinearGradientBrush(rect, Color.FromArgb(opacity + 20, tem_Color), Color.FromArgb(opacity, tem_Color), LinearGradientMode.Vertical)){g.FillPath(br, bh);//填充按钮背景}g.SmoothingMode = sm;//设置呈现的质量}}/// <summary>/// 按钮的圆角绘制/// </summary>/// <param rect="Rectangle">绘制按钮的区域</param>/// <param radius="int">圆角的度数</param>private static GraphicsPath CreateCobOblong(Rectangle rectangle, int radius){GraphicsPath path = new GraphicsPath();//实例化GraphicsPath类int l = rectangle.Left;//获取矩形左上角的X坐标int t = rectangle.Top;//获取矩形左上角的Y坐标int w = rectangle.Width;//获取矩形的宽度int h = rectangle.Height;//获取矩形的高度path.AddArc(l, t, 2 * radius, 2 * radius, 180, 90);//在矩形的左上角绘制圆角path.AddLine(l + radius, t, l + w - radius, t);//绘制左上角圆角与右上角之间的线段path.AddArc(l + w - 2 * radius, t, 2 * radius, 2 * radius, 270, 90);//绘制右上角的圆角path.AddLine(l + w, t + radius, l + w, t + h - radius);//绘制左上角、右上角和右下角所形成的三角形path.AddArc(l + w - 2 * radius, t + h - 2 * radius, 2 * radius, 2 * radius, 0, 90);//绘制右下角圆角path.AddLine(l + radius, t + h, l + w - radius, t + h);//绘制右下角圆角与左上角圆之间的线段path.AddArc(l, t + h - 2 * radius, 2 * radius, 2 * radius, 90, 90);//绘制左下角的圆角path.AddLine(l, t + radius, l, t + h - radius);//绘制左上角、左下角和右下角之间的三角形return path;}/// <summary>/// 按钮的下半个圆角绘制/// </summary>/// <param rect="Rectangle">绘制下半部按钮的区域</param>/// <param radius="int">圆角的度数</param>private static GraphicsPath CreateCobAjar(Rectangle rectangle, int radius){GraphicsPath path = new GraphicsPath();int l = rectangle.Left;//获取矩形左上角的X坐标int t = rectangle.Top;//获取矩形左上角的Y坐标int w = rectangle.Width;//获取矩形的宽度int h = rectangle.Height;//获取矩形的高度path.AddArc(l, t, 2 * radius, 2 * radius, 0, 0);//绘制左上角的点path.AddLine(l, t, l + w, t);//绘制左上角与右上角之间的线段path.AddArc(l + w, t, 2 * radius, 2 * radius, 0, 0);//绘制右上角的点path.AddLine(l + w, t + radius, l + w, t + h - radius);//绘制左上角、右上角和右下角所形成的三角形path.AddArc(l + w - 2 * radius, t + h - 2 * radius, 2 * radius, 2 * radius, 0, 90);//绘制右下角圆角path.AddLine(l + radius, t + h, l + w - radius, t + h);//绘制右下角圆角与左上角圆之间的线段path.AddArc(l, t + h - 2 * radius, 2 * radius, 2 * radius, 90, 90);//绘制左下角的圆角path.AddLine(l, t + radius, l, t + h - radius);//绘制左上角、左下角和右下角之间的三角形return path;}#endregion}
}

然后新建一个窗体Form1然后拖拽一个新建的自定义水晶控件

代码下载

https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12241085

Winform中实现自定义水晶按钮控件(附代码下载)相关推荐

  1. Winform中实现右下角Popuo弹窗提醒效果(附代码下载)

    场景 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建一个fo ...

  2. Winform中使用Timer实现滚动字幕效果(附代码下载)

    场景 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建一个Fo ...

  3. 利用.NET绘图技术制作水晶按钮控件(转)

    UI(User Interface)编程在整个项目开发过程中是个颇为重要的环节,任何好的解决方案若没有良好的用户界面呈现给最终用户,那么就算包含了最先进的技术也 不能算是好程序.UI编程体现在两个方面 ...

  4. 利用.NET绘图技术制作水晶按钮控件[转]

    UI(User Interface)编程在整个项目开发过程中是个颇为重要的环节,任何好的解决方案若没有良好的用户界面呈现给最终用户,那么就算包含了最先进的技术也不能算是好程序.UI编程体现在两个方面, ...

  5. 在Winform中使用MoonPdfLib(Wpf控件)

    在Winform中使用MoonPdfLib(Wpf控件) 引用WindowsFormsIntegration.dll,使用ElementHost类的Child属性关联wpf控件 1.新建winform ...

  6. wxpython bind自定义_wxpython 支持python语法高亮的自定义文本框控件的代码

    在研发闲暇时间,把开发过程中比较重要的一些代码做个珍藏,下面的代码内容是关于wxpython 支持python语法高亮的自定义文本框控件的代码,应该是对大家也有用. import keyword im ...

  7. [导入]Asp.net 2.0 自定义控件开发[创建自定义浮动菜单FloadMenu控件][示例代码下载]...

    Asp.net 2.0 自定义控件开发[创建自定义浮动菜单FloadMenu控件][示例代码下载] 文章来源:http://blog.csdn.net/chengking/archive/2007/0 ...

  8. togglebutton用法 java_Android中ToggleButton开关状态按钮控件使用方法详解

    ToggleButton开关状态按钮控件使用方法,具体内容如下 一.简介 1. 2.ToggleButton类结构 父类是CompoundButton,引包的时候注意下 二.ToggleButton开 ...

  9. JPA中实现双向多对多的关联关系(附代码下载)

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

最新文章

  1. phpexcel_cell 获取表格样式_Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行...
  2. 图神经网络可以解决现实世界中的问题吗?
  3. java byte大小_Java中byte大小格式化
  4. 【数据挖掘】决策树 分类 ( 抽取分类规则 | 过拟合 | 剪枝 | 先剪 | 后剪 | 连续数值离散化 | 最优化分点 | 增益率选择划分属性 )
  5. 使用Reactor进行反应式编程最全教程
  6. WebRTC 及点对点网络通信机制
  7. 哦豁?这个程序员…… 有、东西!
  8. 腾讯AI Lab副主任俞栋:语音识别领域的现状与进展
  9. 【集合工具类:Collections】
  10. python函数模块化教程_【软件测试教程】Python模块化以及内置模块的使用
  11. Spring的beans标签下可以有其他标签
  12. java反射经典实例 Java Reflection Cookbook
  13. swiper轮播在vue中动态绑定返回的数据图片显示不完整
  14. javascript调试
  15. CPU过载、内存溢出分析
  16. Debian系安装rabbitmq
  17. 【解决问题】FlutterBlue在安卓手机上无法连接蓝牙设备,扫描缓慢
  18. 520套日式 韩游 消除RGB类 人物角色 动画序列帧 手游动画
  19. Synopsys ICC 笔记
  20. 盘点系列:一览2022卡塔尔世界杯最全黑科技

热门文章

  1. springboot结果集空值处理
  2. 前后端分离开发,日志应该如何进行记录,在出现问题的时候,方便定位问题
  3. java中实现十六进制和二进制之间的相互转换
  4. Spring AOP(一) AOP基本概念
  5. 内向者优势 原版_未来内向的人具有越来越高的竞争力——心理学:学会运用性格优势...
  6. 项目日报模板_雄东片区A单元安置房项目首栋住宅楼主体结构封顶
  7. 排序算法时间复杂度、空间复杂度、稳定性整理
  8. c# 微服务学习_关于使用“江西微就业”服务平台学习掌握就业创业帮扶政策的通知...
  9. status c语言_C/C++编程笔记:C语言编程风格个人总结,初学小白可借鉴
  10. git撤销某文件被添加到暂存区的修改,且回到文件未修改前的原样