1.代码结构

2.实现代码

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;namespace WinFormBeautyButtonDemo
{/// <summary>///     WinForm自制水晶按钮(很漂亮)///     LDH @ 2019-7-18/// </summary>public sealed partial class BeautyButton : Button{/// <summary>///     定义一个位图/// </summary>private Bitmap _btnbmp;/// <summary>///     定义一个矩形/// </summary>private Rectangle _btnrc;private MouseActionType _mouseActionType;public BeautyButton(){InitializeComponent();_mouseActionType = MouseActionType.None;SetStyle(ControlStyles.AllPaintingInWmPaint | // 禁止擦除背景ControlStyles.DoubleBuffer | // 双缓冲ControlStyles.UserPaint, true);// 下面这些可以不设置,也可以自己定义Font = new Font("微软雅黑", 12, FontStyle.Bold);BackColor = Color.DarkTurquoise;Size = new Size(112, 48);}/// <summary>///     按钮形状/// </summary>/// <param name="rc">按钮的坐标和大小</param>/// <param name="r">按钮圆弧的半径</param>/// <returns>返回按钮形状</returns>private GraphicsPath GetGraphicsPath(Rectangle rc, int r){int x = rc.X, y = rc.Y, w = rc.Width, h = rc.Height;var path = new GraphicsPath();path.AddArc(x, y, r, r, 180, 90); // 左上角圆弧path.AddArc(x + w - r, y, r, r, 270, 90); // 右上角圆弧path.AddArc(x + w - r, y + h - r, r, r, 0, 90); // 右下角圆弧path.AddArc(x, y + h - r, r, r, 90, 90); // 左下角圆弧path.CloseFigure(); // 闭合return path;}protected override void OnPaint(PaintEventArgs pe){// base.OnPaint(pe);var g = pe.Graphics; // 创建画布g.Clear(SystemColors.ButtonFace); // 重置背景颜色,可以自定义var clr = BackColor;var btnOff = 0; // 按钮边距var shadowOff = 0; // 阴影边距switch (_mouseActionType){case MouseActionType.None:break;case MouseActionType.Hover:clr = Color.LightGray;break;case MouseActionType.Click:shadowOff = 4;clr = Color.LightGray;btnOff = 2;break;}g.SmoothingMode = SmoothingMode.AntiAlias; // 消除锯齿// 创建按钮本身的图形var rc1 = new Rectangle(btnOff, btnOff, ClientSize.Width - 8 - btnOff, ClientSize.Height - 8 - btnOff);var path1 = GetGraphicsPath(rc1, 20);var br1 = new LinearGradientBrush(new Point(0, 0), new Point(0, rc1.Height + 6), clr, Color.White);// 创建按钮阴影var rc2 = rc1;rc2.Offset(shadowOff, shadowOff);var path2 = GetGraphicsPath(rc2, 20);var br2 = new PathGradientBrush(path2){CenterColor = Color.Black, SurroundColors = new[] {SystemColors.ButtonFace}};// 为了更逼真,我们将渐变结束颜色设定为窗体前景色,可以根据窗口的前景颜色适当调整// 创建按钮顶部白色渐变var rc3 = rc1;rc3.Inflate(-5, -5);rc3.Height = 15;var path3 = GetGraphicsPath(rc3, 20);var br3 = new LinearGradientBrush(rc3, Color.FromArgb(255, Color.White), Color.FromArgb(0, Color.White),LinearGradientMode.Vertical);// 绘制图形g.FillPath(br2, path2); // 绘制阴影g.FillPath(br1, path1); // 绘制按钮g.FillPath(br3, path3); // 绘制顶部白色泡泡// 设定内存位图对象,进行二级缓存绘图操作_btnrc = new Rectangle(rc1.Location, rc1.Size);_btnbmp = new Bitmap(_btnrc.Width, _btnrc.Height);var gBmp = Graphics.FromImage(_btnbmp);gBmp.SmoothingMode = SmoothingMode.AntiAlias;gBmp.FillPath(br1, path1);gBmp.FillPath(br3, path3);// 将region赋值给buttonvar rgn = new Region(path1);rgn.Union(path2);Region = rgn;// 绘制按钮的文本var path4 = new GraphicsPath();var path1Bounds = path1.GetBounds();var rcText = new Rectangle((int) path1Bounds.X + btnOff, (int) path1Bounds.Y + btnOff,(int) path1Bounds.Width,(int) path1Bounds.Height);var strFormat = new StringFormat{Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center};// 横竖都居中path4.AddString(Text, Font.FontFamily, (int) Font.Style, Font.Size, rcText, strFormat);var txtPen = new Pen(ForeColor, 1);g.DrawPath(txtPen, path4);gBmp.DrawPath(txtPen, path4);}protected override void OnMouseDown(MouseEventArgs eventArgs){if (eventArgs.Button == MouseButtons.Left){_mouseActionType = MouseActionType.Click;Invalidate();}base.OnMouseDown(eventArgs);}protected override void OnMouseUp(MouseEventArgs eventArgs){_mouseActionType = MouseActionType.Hover;Invalidate();base.OnMouseUp(eventArgs);}protected override void OnMouseHover(EventArgs e){_mouseActionType = MouseActionType.Hover;Invalidate();base.OnMouseHover(e);}protected override void OnMouseEnter(EventArgs e){_mouseActionType = MouseActionType.Hover;Invalidate();base.OnMouseEnter(e);}/// <summary>///     鼠标离开事件/// </summary>/// <param name="e"></param>protected override void OnMouseLeave(EventArgs e){_mouseActionType = MouseActionType.None;Invalidate();base.OnMouseLeave(e);}private enum MouseActionType{None,Hover,Click}}
}

3.运行效果

转载于:https://www.cnblogs.com/LifeDecidesHappiness/p/11210336.html

WinForm自制水晶按钮相关推荐

  1. Winform中实现自定义水晶按钮控件(附代码下载)

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

  2. Photoshop五步制作水晶按钮

    用Photoshop五步制作简单实用水晶按钮 类水晶的按钮,在很多地方都能用道,那么有没有快速的方法制作出逼真的水晶按钮呢?呵呵,我在这里介绍一下我的制作方法,(是在观察了很多类水晶按钮之后)发现如下 ...

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

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

  4. Photoshop 制作水晶按钮

    1.新建文件,宽.高都为5,单位cm,分辨率200,模式为RGB,白色背景. 2.用圆形选框工具画出圆形选框,在选区内点鼠标右键,选"通过拷贝的图层"项(图层1). 3.新建图层( ...

  5. 使用C# winform 制作一个按钮可自适应屏幕大小的 简易加减乘除计算器

    一:成果物     不多展示,,,我们开始吧.. 二: 窗体包含内容 2.1 显示屏部分组成 显示屏部分由两个组件组成,一个是方便操作的panel控件位于顶部,且为了使其显示屏在改变窗体大小时一直位于 ...

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

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

  7. Phtoshop五步制作水晶按钮

    类水晶的按钮,在很多地方都能用到,那么有没有快速的方法制作出逼真的水晶按钮呢?呵呵,我在这里介绍一下我的制作方法,(是在观察了很多类水晶按钮之后)发现如下方法最为简单,而且制作的效果尚可.所以介绍给大 ...

  8. C#制作高仿360安全卫士窗体(四)- 水晶按钮

    项目越来越紧,我也乐此不疲.自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西.我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用.所以只 ...

  9. C# WinForm给Button按钮或其它控件添加快捷键响应

    就在这介绍三种添加快捷键的方式. 第一种Alt + *(按钮快捷键) 在大家给button.label.menuStrip等控件设置Text属性时在名字后边加&键名就可以了,比如button1 ...

  10. c# winform 点击按钮切换tabcontrol标签

    this.tabControl1.TabPages.Remove(tabPage1); this.tabControl1.TabPages.Remove(tabPage2); this.tabCont ...

最新文章

  1. Maven国内源设置 - OSChina国内源失效了,别更新了
  2. 011_学生管理系统二
  3. SQL 中的游标实例
  4. Jmeter设置变量与引用变量(三)
  5. linux-basic(7)linux文件与目录管理
  6. 从0到1构建支撑企业自动化运维体系
  7. iOS常用第三方类库 Xcode插件
  8. 互联网晚报 | 10月27日 星期三 | 高德车道级导航正式发布;阿里淘菜菜发布“本地菜”计划;特斯拉市值破万亿美元...
  9. 文件快速拷贝工具大比拼,谁是最快的复制软件
  10. sonic云真机linux分布式部署
  11. 中铁二局全面推行建筑工地务工人员实名制管理
  12. 机器学习相关职位走向
  13. 动手写一个探测网络质量(丢包率/RTT/队形等)的工具
  14. 电脑小知识:最常用的10个电脑技巧
  15. C语言学习笔记之初识
  16. 计算机开机屏幕英语,电脑开机进不了系统,屏幕一堆英文数字怎么办?别急有方法...
  17. echarts引入地图不成功(使用echarts遇到的坑)
  18. Spring Boot(号称Java当前最流行的开发框架) 中启动HTTPS
  19. 利用copy命令合成一个图片马使用
  20. Python制作的赛车小游戏源代码,逆行飙车

热门文章

  1. Android 子线程更新UI
  2. 面试常见的 10 大问题
  3. 第一方数据,第二方数据,第三方数据:你了解多少?
  4. 热风销售不合格凉鞋、外套遭处罚,服装商家经营需诚信
  5. Ubuntu中恢复rm命令误删文件(超级详细+亲测有效)
  6. 2021中国医疗机器人产业创新大会参会指南
  7. 太秀了!程序媛小姐姐写出代码版《本草纲目》,刘畊宏回复:很cool!
  8. arm有啥不同 intel_Intel处理器真的胜过ARM了?安兔兔什么的才不可靠呢
  9. GNU汇编器——.syntax
  10. vue脚手架安装步骤详情