C# 自制水晶按钮(很漂亮)

独孤侠客 2012-07-27 04:57:56
网上找的,直接上代码,供初学者学习借鉴:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

namespace GButton
{
public partial class GZXButton : Button
{
private enum MouseActionType
{
None,
Hover,
Click
}
private MouseActionType mouseActionType;
private ImageAttributes imgattr = new ImageAttributes();//实例化一个图像属性类
private Bitmap btnbmp;//定义一个位图
private Rectangle btnrc;//定义一个矩形

public GZXButton()
{
InitializeComponent();
mouseActionType = MouseActionType.None;
this.SetStyle(ControlStyles.AllPaintingInWmPaint|//禁止擦除背景
ControlStyles.DoubleBuffer|//双缓冲
ControlStyles.UserPaint,true);
//下面这些可以不设置,也可以自己定义
this.Font = new Font("Aial Black", 12, FontStyle.Bold);
this.BackColor = Color.DarkTurquoise;
this.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;
GraphicsPath gpath = new GraphicsPath();
gpath.AddArc(x, y, r, r, 180, 90);//左上角圆弧
gpath.AddArc(x + w - r, y, r, r, 270, 90);//右上角圆弧
gpath.AddArc(x + w - r, y + h - r,r, r, 0, 90);//右下角圆弧
gpath.AddArc(x, y + h - r, r, r, 90, 90);//左下角圆弧
gpath.CloseFigure();//闭合
return gpath;
}
protected override void OnPaint(PaintEventArgs pe)
{
// base.OnPaint(pe);
Graphics g = pe.Graphics;//创建画布
g.Clear(SystemColors.ButtonFace);//重置背景颜色,可以自定义
Color clr = this.BackColor;
int btnOff = 0;//按钮边距
int 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;
default:
break;
}
g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
//创建按钮本身的图形
Rectangle rc1 = new Rectangle(btnOff, btnOff, this.ClientSize.Width - 8 - btnOff, this.ClientSize.Height - 8 - btnOff);
GraphicsPath gpath1 = this.GetGraphicsPath(rc1, 20);
LinearGradientBrush br1 = new LinearGradientBrush(new Point(0, 0), new Point(0, rc1.Height + 6), clr, Color.White);
//创建按钮阴影
Rectangle rc2 = rc1;
rc2.Offset(shadowOff, shadowOff);
GraphicsPath gpath2 = this.GetGraphicsPath(rc2, 20);
PathGradientBrush br2 = new PathGradientBrush(gpath2);
br2.CenterColor = Color.Black;
br2.SurroundColors = new Color[] { SystemColors.ButtonFace };
//为了更逼真,我们将渐变结束颜色设定为窗体前景色,可以根据窗口的前景颜色适当调整
//创建按钮顶部白色渐变
Rectangle rc3 = rc1;
rc3.Inflate(-5, -5);
rc3.Height = 15;
GraphicsPath gpath3 = GetGraphicsPath(rc3, 20);
LinearGradientBrush br3 = new LinearGradientBrush(rc3, Color.FromArgb(255, Color.White), Color.FromArgb(0, Color.White), LinearGradientMode.Vertical);
//绘制图形
g.FillPath(br2, gpath2);//绘制阴影
g.FillPath(br1, gpath1);//绘制按钮
g.FillPath(br3, gpath3);//绘制顶部白色泡泡
//设定内存位图对象,进行二级缓存绘图操作
btnrc = new Rectangle(rc1.Location, rc1.Size);
btnbmp = new Bitmap(btnrc.Width, btnrc.Height);
Graphics g_bmp = Graphics.FromImage(btnbmp);
g_bmp.SmoothingMode = SmoothingMode.AntiAlias;
g_bmp.FillPath(br1, gpath1);
g_bmp.FillPath(br3, gpath3);
//将region赋值给button
Region rgn = new Region(gpath1);
rgn.Union(gpath2);
this.Region = rgn;
//绘制按钮的文本
GraphicsPath gpath4 = new GraphicsPath();
RectangleF gpath1bounds = gpath1.GetBounds();
Rectangle rcText = new Rectangle((int)gpath1bounds.X + btnOff, (int)gpath1bounds.Y + btnOff, (int)gpath1bounds.Width,
(int)gpath1bounds.Height);
StringFormat strFormat = new StringFormat();
strFormat.Alignment = StringAlignment.Center;
strFormat.LineAlignment = StringAlignment.Center;//横竖都居中
gpath4.AddString(this.Text, this.Font.FontFamily, (int)this.Font.Style, this.Font.Size, rcText, strFormat);
Pen txtPen = new Pen(this.ForeColor, 1);
g.DrawPath(txtPen, gpath4);
g_bmp.DrawPath(txtPen, gpath4);
}
protected override void OnMouseDown(MouseEventArgs mevent)
{
if (mevent.Button == MouseButtons.Left)
{
this.mouseActionType = MouseActionType.Click;
this.Invalidate();
}
base.OnMouseDown(mevent);
}
protected override void OnMouseUp(MouseEventArgs mevent)
{
this.mouseActionType = MouseActionType.Hover;
this.Invalidate();
base.OnMouseUp(mevent);
}
protected override void OnMouseHover(EventArgs e)
{
this.mouseActionType = MouseActionType.Hover;
this.Invalidate();
base.OnMouseHover(e);
}
protected override void OnMouseEnter(EventArgs e)
{
this.mouseActionType = MouseActionType.Hover;
this.Invalidate();
base.OnMouseEnter(e);
}
protected override void OnMouseLeave(EventArgs e)//鼠标离开事件
{
this.mouseActionType = MouseActionType.None;
this.Invalidate();
base.OnMouseLeave(e);
}
}
}



这个始终不会发图,有人告诉我吗?我没有可以放图片的网上空间。。。。
...全文
1383 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ti8song53 2014-11-12
  • 打赏
  • 举报
回复
很好用……我用这个方法做了一个自定义控件……谢谢啦……
  • 打赏
  • 举报
回复
引用 10 楼 dujiyong 的回复:
这怎么用啊,我是新手
自己新建一个项目,在项目上右键新建窗体或者控件,把代码贴进去,右键项目生成,然后在工具箱引用你刚才生成的exe文件就行了,用的时候从工具箱拖进来
dujiyong 2013-12-27
  • 打赏
  • 举报
回复
这怎么用啊,我是新手
jwx0925 2012-12-11
  • 打赏
  • 举报
回复
您好,我想问下这是添加在用户控件类中的吗?
wakilili 2012-09-02
  • 打赏
  • 举报
回复
谢谢,确实做的很漂亮,找了好久了,终于找了个好的
独孤侠客 2012-07-30
  • 打赏
  • 举报
回复
鼠标up的状态

鼠标down的状态
青天流雲 2012-07-27
  • 打赏
  • 举报
回复
给个图瞧瞧呗
bigbaldy 2012-07-27
  • 打赏
  • 举报
回复
感谢楼主分享,不过做界面还是WPF吧,用Blend画,那简直太方便了,而且非常漂亮
续写经典 2012-07-27
  • 打赏
  • 举报
回复
如此强大,楼主上个图片啊
mizuho_2006 2012-07-27
  • 打赏
  • 举报
回复
我也在网上找过好几个重写的按钮,都挺漂亮的。
但用的太多会影响效率,以前用几个重写后的processbar后CPU占用率就接近100%了

还是用 WPF做的漂亮些
bdmh 2012-07-27
  • 打赏
  • 举报
回复
他图片放到空间里,引入连接
我们把同一标的(昆仑万维,现价 43.20 元,2026-07-31 收盘)交给三套系统,各出一份独立分析: **C 报告(CoordClaw 基于管理学多智能体系统)**——投研级。它由五个角色构成:周婷整合撰写、李静出基本面、王芳出技术面、赵明出风险、陈默做 PM 终审。最终产物是一份 38 项分级风险清单(P0×4 / P1×12 / P2×12 / P3×6 / 尾部×4)、双源交叉验证的财务数据(EM/Sina 差异 <0.01%)、严格的口径纪律,以及一份原样保留的"待核实"清单。结论冷冰冰:高风险,不建议参与。 **D 报告(DeepSeek)**——信息整理级。它把"4+3 AGI 战略"、天工 AI、Opera 浏览器、StarMaker 拆得很漂亮,核心财务数据(营收 81.98 亿、归母 -15.93 亿)也没算错。但整篇没有技术面、没有量化风控,更关键的是——它完全没提实控人已减持 75%、质押状态未知、净现金仅 15.19 亿且续航只有 1.26~1.81 年这些要命的负面。这是典型的"选择性呈现"。 **K 报告(Kimi)**——以对比评估的方式呈现。它搭起"数据准确性 / 分析维度 / 结论合理性"的三维框架,把几份材料放在一起对照,给出各自的强弱判定。它的维度意识比 D 报告更自觉,但作为一份独立分析,它对"评估方法本身的信度"交待不足,部分引用的核对也不够彻底。 结果两家的结论高度一致。C 报告(多智能体)被评投研级、居首;D 报告(DeepSeek 自己写的)被评信息整理级、居中;K 报告(Kimi 自己那份)维度较全但核验深度有限,排在两者之间。DeepSeek 的那份评估把 C 给了五星、D 三星、K 四星;Kimi 的那份评估也独立地把最高分给了 C。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧