做了一个控件,这样就可以告别图片按钮了:)
效果:
程序源代码:
 
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();
 }
 }
 
 }
}