在使用C#进行界面开发的过程中,做界面开发经常会用到按钮,而C#界面中的按钮形状只有矩形的,而如果我们需要其他形状的按钮的话,就需要想点儿其他办法了,一般开发自己的控件有三种方法:
首先是复合控件,从字面上就可以理解,是在原有控件的基础上进行组合,组合后的控件就是一个全新的控件;
其次是扩展控件,一般控件都是用一个类进行了封装,我们可以通过继承该类,然后对其进行改写,赋予其新的特性;
最后是自定义控件,这个方法是“写我们自己的控件”,DIY的程度最高,当然对编程要求也最高,也是最灵活,最强大的方法;
本文先说说第二种方法的具体实现。
该方法是对原有的类进行改写,比如我们需要修改button的属性,可以对button类进行修改并继承,进行onpaint函数的重新改写。这样做的好处就是可以使得做出来的界面比较友好,在按钮的形状和颜色方面相比原来的会比较丰富一些。
具体的操作过程如下:
在VS2015下,新建类库,取名,确定。
然后引用动态库System.Windows.Forms:
添加如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.ComponentModel;
namespace myNewButton
{
public class colorfulButton:Button
{
Rectangle r= new Rectangle(0, 0, 150, 80);
Rectangle r2 = new Rectangle(0,0,100,50);
private Brush _myBrush = null;
private Color _color1 = System.Drawing.Color.FromArgb(255, 255, 192);
private Color _color2 = System.Drawing.Color.FromArgb(0, 0, 192);
[Category("设置"), Description("渐变开始颜色")]
public Color color1
{
get { return _color1; }
set { _color1 = value; }
}
[Category("设置"), Description("渐变结束颜色")]
public Color color2
{
get { return _color2; }
set { _color2 = value; }
}
public void ButtonNew()
{
r = new Rectangle(0, 0, 150, 80);
_myBrush = new LinearGradientBrush(r, _color1, _color2, LinearGradientMode.Vertical);
}
public Brush MyBrush
{
get { return _myBrush; }
set { _myBrush = value; }
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
r = new Rectangle(0, 0, this.Width, this.Height);
_myBrush = new LinearGradientBrush(r, _color1, _color2, LinearGradientMode.Vertical);
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
r = new Rectangle(0, 0, this.Width, this.Height);
_myBrush = new LinearGradientBrush(r, _color1, _color2, LinearGradientMode.Vertical);
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
r = new Rectangle(0, 0, this.Width, this.Height);
_myBrush = new LinearGradientBrush(r, _color2, _color1, LinearGradientMode.Vertical);
}
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
Graphics g = pevent.Graphics;
_myBrush = new LinearGradientBrush(r, _color1, _color2, LinearGradientMode.Vertical);
g.FillRectangle(_myBrush,this.ClientRectangle);
StringFormat strF = new StringFormat();
strF.Alignment = StringAlignment.Center;
strF.LineAlignment = StringAlignment.Center;
g.DrawString(this.Text, this.Font, new SolidBrush(Color.Black), this.ClientRectangle, strF);
}
}
}