做了一个控件,这样就可以告别图片按钮了:)

 

程序源代码:

 

 

 

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();

   }

  }

 

}

}

 

posted on 2008-11-12 18:56  〆o殺殸纨o〆  阅读(165)  评论(0编辑  收藏  举报