PDA上的那个2D的按钮实在太丑了,做了一个图片按钮,与大家共享。参考了 xyocj-- .net cf 兄弟的Blog中的文章,在这里表示感谢。
picButton.cs文件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Streamsea.Properties;

namespace Streamsea.Forms


{

/**//// <summary>
/// 图片按钮
/// </summary>
public partial class ucPictureButton : UserControl

{
private bool bPressed;
private Image pressImg;
private Image backImg;
private Image disableImg;

private Image m_img;
private PictureBoxSizeMode m_sizemode = PictureBoxSizeMode.StretchImage;


/**//// <summary>
/// 构造函数
/// </summary>
public ucPictureButton()

{
base.Font = new Font("Tahoma", 9F, System.Drawing.FontStyle.Bold);
}

private Size _GetPreferredSize()

{
if (this.m_img == null)

{
return base.Size;
}
return this.m_img.Size;
}

private Rectangle _ImageRectangle

{
get

{
Rectangle rectangle1 = new Rectangle(0, 0, 0, 0);
if (this.m_img != null)

{
switch (this.m_sizemode)

{
case PictureBoxSizeMode.Normal:
rectangle1.Size = this.m_img.Size;
return rectangle1;

case PictureBoxSizeMode.StretchImage:
rectangle1.Size = base.ClientSize;
return rectangle1;

case ((PictureBoxSizeMode)2):
return rectangle1;

case PictureBoxSizeMode.CenterImage:

{
rectangle1.Size = this.m_img.Size;
Size size1 = base.ClientSize;
rectangle1.X = (size1.Width - rectangle1.Width) / 2;
rectangle1.Y = (size1.Height - rectangle1.Height) / 2;
return rectangle1;
}
}
}
return rectangle1;
}
}


/**//// <summary>
/// 指示如何显示图像。
/// </summary>
[DefaultValue(PictureBoxSizeMode.StretchImage)]
public PictureBoxSizeMode SizeMode

{
get

{
return this.m_sizemode;
}
set

{
if (!Enum.IsDefined(typeof(PictureBoxSizeMode), value))

{
throw new ArgumentException();
}
if (this.m_sizemode != value)

{
this.m_sizemode = value;
base.Invalidate();
}
}
}


/**//// <summary>
/// 背景图像
/// </summary>
[DefaultValue((string)null)]
public Image BackImage

{

get
{ return backImg; }
set

{
backImg = value;
m_img = backImg;
base.Invalidate();
}
}


/**//// <summary>
/// 按下时的图像
/// </summary>
[DefaultValue((string)null)]
public Image PressImage

{

get
{ return pressImg; }
set

{
pressImg = value;
base.Invalidate();
}
}


/**//// <summary>
/// 不可用时的图像
/// </summary>
[DefaultValue((string)null)]
public Image DisableImage

{

get
{ return disableImg; }
set

{
disableImg = value;
m_img = disableImg;
base.Invalidate();
}
}


/**//// <summary>
/// 按钮文字
/// </summary>
public string ButtonText

{
get

{
return base.Text;
}
set

{
base.Text = value;
this.Invalidate();
}
}


/**//// <summary>
/// 获取或设置一个值,该值指示控件是否可以对用户交互作出响应。
/// </summary>
public new bool Enabled

{

get
{ return base.Enabled; }
set

{
base.Enabled = value;
this.Invalidate();
}
}

/**//// <summary>
/// 引发 System.Windows.Forms.Control.MouseDown 事件。
/// </summary>
/// <param name="e"></param>
protected override void OnMouseDown(MouseEventArgs e)

{
this.bPressed = true;
this.Invalidate();
base.OnMouseDown(e);
}

/**//// <summary>
/// 引发 System.Windows.Forms.Control.MouseUp 事件。
/// </summary>
/// <param name="e"></param>
protected override void OnMouseUp(MouseEventArgs e)

{
this.bPressed = false;
this.Invalidate();
base.OnMouseUp(e);
}


/**//// <summary>
/// 绘制控件的背景。
/// </summary>
/// <param name="e"></param>
protected override void OnPaintBackground(PaintEventArgs e)

{
Region region1 = new Region(base.ClientRectangle);
region1.Exclude(this._ImageRectangle);
e.Graphics.FillRegion(new SolidBrush(this.Parent!=null?this.Parent.BackColor:Color.White), region1);
region1.Dispose();
}

/**//// <summary>
/// 引发 System.Windows.Forms.Control.Paint 事件。
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)

{
if (this.bPressed)

{
if (pressImg == null)

{
pressImg = Resources.PressImage;
}
m_img = pressImg;
}
else if (this.Enabled)

{
if (backImg == null)

{
backImg = Resources.BackImage;
}
m_img = backImg;
}
else

{
if (disableImg == null)

{
disableImg = Resources.DisableImage;
}
m_img = disableImg;
}
e.Graphics.DrawImage(this.m_img, this._ImageRectangle, new Rectangle(0, 0, this.m_img.Width, this.m_img.Height), GraphicsUnit.Pixel);

if (this.ButtonText.Length > 0)

{
SizeF size = e.Graphics.MeasureString(this.ButtonText, this.Font);
e.Graphics.DrawString(this.ButtonText, this.Font, new SolidBrush(Enabled?this.ForeColor:Color.Gray),
(this.ClientSize.Width - size.Width) / 2, (this.ClientSize.Height - size.Height) / 2);
}
//e.Graphics.DrawRectangle(new Pen(this.Parent != null ? this.Parent.BackColor : Color.White), 0, 0, this.ClientSize.Width - 1, this.ClientSize.Height - 1);
base.OnPaint(e);
}

/**//// <summary>
/// 引发 System.Windows.Forms.Control.Resize 事件。
/// </summary>
/// <param name="eventg"></param>
protected override void OnResize(EventArgs eventg)

{
base.OnResize(eventg);
if ((this.m_sizemode == PictureBoxSizeMode.StretchImage) || (this.m_sizemode == PictureBoxSizeMode.CenterImage))

{
base.Invalidate();
}
}
}
}

picButton.Designer.cs
namespace Streamsea.Forms


{
partial class ucPictureButton

{

/**//// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;


/**//// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)

{
if (disposing && (components != null))

{
components.Dispose();
}
base.Dispose(disposing);
}


组件设计器生成的代码#region 组件设计器生成的代码


/**//// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()

{

}
#endregion
}
}

在项目属性的资源文件里添加3张图片,名字分别为 BackImage DisableImage PressImage,这是默认的图片,在设计和谐程序的时候也可以换用其他图片的。