做了一个控件,这样就可以告别图片按钮了:)
效果:
程序源代码:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
namespace WindowsControlLibrary1
{
/// <summary>
/// UserControl1 的摘要说明。
/// </summary>
public class UserControl1 : Button
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private bool XiaCen=false;
private bool mouseMove=false;
private Color backColor;
public UserControl1()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();
// TODO: 在 InitComponent 调用后添加任何初始化
backColor=this.backColor;
//this.Text=this.ShowFocusCues.ToString();
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
components.Dispose();
}
base.Dispose( disposing );
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
//
// UserControl1
//
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.UserControl1_MouseUp);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.UserControl1_Paint);
this.MouseEnter += new System.EventHandler(this.UserControl1_MouseEnter);
this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.UserControl1_KeyUp);
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.UserControl1_KeyDown);
this.BackColorChanged += new System.EventHandler(this.UserControl1_BackColorChanged);
this.MouseLeave += new System.EventHandler(this.UserControl1_MouseLeave);
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.UserControl1_MouseDown);
}
#endregion
protected GraphicsPath GetGraphicsPath(Rectangle rect)
{
GraphicsPath ClientPath = new System.Drawing.Drawing2D.GraphicsPath();
if(rect.Width<=0)
{
rect.Width=1;
}
if(rect.Height<=0)
{
rect.Height=1;
}
ClientPath.AddArc(rect.Left,rect.Top,rect.Height,rect.Height,90f,180f);
ClientPath.AddArc(rect.Right-rect.Height,rect.Top,rect.Height,rect.Height,270f,180f);
ClientPath.CloseFigure();
return ClientPath;
}
protected GraphicsPath GetGraphicsPath1(Rectangle rect)
{
GraphicsPath ClientPath = new System.Drawing.Drawing2D.GraphicsPath();
if(rect.Width<=0)
{
rect.Width=1;
}
if(rect.Height<=0)
{
rect.Height=1;
}
ClientPath.AddArc(rect.Left,rect.Top,rect.Height,rect.Height,190f,80f);
ClientPath.AddArc(rect.Right-rect.Height,rect.Top,rect.Height,rect.Height,270f,80f);
ClientPath.CloseFigure();
return ClientPath;
}
private void DrawYinYing(Graphics gr,bool xiacen)
{
Rectangle rect= this.ClientRectangle;
rect.Inflate(-(rect.Width/10),-(rect.Height)/4);
float bf1=rect.Width/100f;
float bf2=rect.Height/100f;
rect.Y=rect.Y+this.ClientRectangle.Height/4;
if(xiacen)
{
rect.Y=rect.Y+4;
}
GraphicsPath path;
for(int a=1;a<33;a++)
{
float bf3=bf1*a;
float bf4=bf2*a;
Rectangle rect1=rect;
rect1.Inflate(-(int)bf3,-(int)bf4);
path=GetGraphicsPath(rect1);
int r=backColor.R;
int g=backColor.G;
int b=backColor.B;
r=r+3*a;
g=g+3*a;
b=b+3*a;
if(r>255) r=255;
if(g>255) g=255;
if(b>255) b=255;
gr.FillPath(new SolidBrush(Color.FromArgb(r,g,b)),path);
}
}
private void DrawGaoLiang(Graphics g,bool xiacen)
{
Rectangle rect= this.ClientRectangle;
rect.Inflate(-4,-4);
if(xiacen)
{
rect.Y=rect.Y+4;
}
GraphicsPath path=GetGraphicsPath1(rect);
RectangleF rect1=path.GetBounds();
rect1.Height=rect1.Height+1;
g.FillPath(new LinearGradientBrush(rect1,
Color.FromArgb(0xff,0xff,0xff,0xff),
Color.FromArgb(0xff,backColor),LinearGradientMode.Vertical),path);
}
private void DrawText(Graphics g,bool xiacen)
{
Rectangle rect= this.ClientRectangle;
Rectangle rect1= this.ClientRectangle;
StringFormat stringFormat=new StringFormat();
stringFormat.Alignment=StringAlignment.Center;
stringFormat.LineAlignment=StringAlignment.Center;
rect.Y=this.ClientRectangle.Height/5;
if(xiacen)
{
rect.Y=rect.Y+4;
rect1.Y=rect1.Y+4;
}
Font font=this.Font;
if(mouseMove)
{
font=new Font(this.Font,FontStyle.Underline);
}
g.DrawString(this.Text,font,
new SolidBrush(Color.FromArgb(0x66,backColor)),rect,stringFormat);
g.DrawString(this.Text,font,new SolidBrush(this.ForeColor),rect1,stringFormat);
}
private void UserControl1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(XiaCen==false)
{
XiaCen=true;
this.Refresh();
}
}
private void UserControl1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(XiaCen==true)
{
XiaCen=false;
this.Refresh();
}
}
private void UserControl1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.FillRectangle(new SolidBrush(backColor),0,0,this.Width,this.Height);
e.Graphics.SmoothingMode=SmoothingMode.HighQuality;
e.Graphics.TextRenderingHint=TextRenderingHint.AntiAliasGridFit;
Rectangle rect=new Rectangle(0,0,this.Width,this.Height);
GraphicsPath ClientPath=GetGraphicsPath(rect);
e.Graphics.FillPath(new SolidBrush(backColor),ClientPath);
this.Region=new System.Drawing.Region(ClientPath);
DrawYinYing(e.Graphics,XiaCen);
DrawGaoLiang(e.Graphics,XiaCen);
DrawText(e.Graphics,XiaCen);
if(this.Focused)
{
e.Graphics.DrawPath(new Pen(Color.FromArgb(0x22,0xff,0xff,0xff), 3), ClientPath);
}
}
private void UserControl1_BackColorChanged(object sender, System.EventArgs e)
{
int r=BackColor.R;
int g=BackColor.G;
int b=BackColor.B;
r=r+0x22;
g=g+0x22;
b=b+0x22;
if(r>255) r=255;
if(g>255) g=255;
if(b>255) b=255;
backColor=Color.FromArgb(r,g,b);
}
private void UserControl1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(XiaCen==false && e.KeyCode==Keys.Space)
{
XiaCen=true;
this.Refresh();
}
}
private void UserControl1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(XiaCen==true && e.KeyCode==Keys.Space)
{
XiaCen=false;
this.Refresh();
}
}
private void UserControl1_MouseEnter(object sender, System.EventArgs e)
{
if(mouseMove==false)
{
mouseMove=true;
this.Refresh();
}
}
private void UserControl1_MouseLeave(object sender, System.EventArgs e)
{
if(mouseMove==true)
{
mouseMove=false;
this.Refresh();
}
}
}
}
分享到:
相关推荐
C#水晶按钮 是一个用重绘的方法实现的水晶效果的按钮
非常炫的C#水晶按钮,资源难得,代码清晰易懂。想做效果很炫的界面的可以下载学习。代码可以直接运行,无BUG。
C#水晶按钮源代码.pdf ,代码在PDF里,根据不同需求做不同应用.
用c#写的水晶按钮,最近在学flash as3脚本,希望可以写出一样的按钮
自定义控件,C#圆形水晶按钮
c#最美最好用的的控件了,有了这两个控件(折叠菜单和水晶按钮),你完全可以做出非常华丽的c#界面,本人一直在用,拿出来跟大家分享,当然也可以自己在此基础上再进行美化
程序源代码: using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data;...using System.Windows.Forms;...using System.Drawing.Drawing2D;...
C# 水晶按钮 很漂亮,有源代码,以后可以直接用哦。
C#水晶按钮控件详细代码示例模块,供初学者参考学习用
利用.Net绘图技术制作水晶按钮控件(C#)利用.Net绘图技术制作水晶按钮控件(C#)
代码,很好用,很漂亮的按钮,是WPF做的,但是是应用到winform的,是自己做的控件。
用C#做的winform版本水晶按钮控件,实现按钮的美化
个C#制作的动态水晶按钮,很漂亮,鼠标进入时慢慢点亮,离开时慢慢熄灭.源代码下载地址:http://download.csdn.net/detail/jhycjhyc/8847773
C# 自定义控件 自定义Button控件 水晶按钮。其他控件的重写与此类似
C#自定义控件---自定义水晶按钮控件完整源码
C#自定义控件---自定义水晶按钮控件完整源码2019
C#自定义控件---自定义水晶按钮控件完整源码(经典)
winForm 实现水晶按钮,可用 winForm 实现水晶按钮,可用
代码 亲测可用喔 是c#的代码 不要下载错了