WinForm自制水晶按钮
发布时间:2020-12-14 05:32:40 所属栏目:Windows 来源:网络整理
导读:1 .代码结构 ? 2 .实现代码 ? using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace WinFormBeautyButtonDemo{ /// summary /// WinForm自制水晶按钮(很漂亮) /// LDH @ 2019-7-18 /// /summary p
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,180,90); // 左上角圆弧 path.AddArc(x + w - r,270,90); // 右上角圆弧 path.AddArc(x + w - r,y + h - r,0,90); // 右下角圆弧 path.AddArc(x,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,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赋值给button var 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.运行效果
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- .net – 全球化现有的Windows窗体应用程序?
- Windows – 管理冗余/冲突组策略
- 对于Windows上的os.path.getmtime(),Python2.4和2.6的行为有
- uwp – Windows 10物联网核心启动应用程序与无头
- Windows上Tomcat的部署
- windows-server-2008 – 如何在不属于域的Windows Server 2
- Windows和Linux中php代码调试工具Xdebug的安装与配置详解
- user-interface – 使用Winelib移植仅限Windows的GUI工具包
- 在Microsoft SQL Server中比较日期的最佳方法是什么?
- Windows Phone字符编码