FlatStyle按钮自己做
和C或VB比起来,使用C#写自定义控件,特别是从零开始写自定义控件,不知简化了多少倍,没有复杂而晦涩的消息映射,思路就像写应用程序一样如行云流水,一路畅通。学过delphi的人都知道有一套FlatStyle控件,平面式的简约风格给用户带来了良好的视觉效果。但是看看他的源码,如果没有一定的Windows底层功底,看起来可不是件容易的事。现在好了,有了C#这个异常强大的工具,我们就可以轻轻松松的写一个自己的FlatStyle控件了。
本文以平面按钮为例,写一个按钮颜色和边框颜色能任意更改的自定义按钮控件,希望能起到抛砖引玉的作用。
如果我们只是改变已有的控件的外观(如本例),那么最好继承原有的控件。如:
public class ButtonLzh : System.Windows.Forms.Button
定义一个枚举类型,用来描述鼠标的状态:
protected enum Status
{
MouseEnter,
MouseLeave,
MouseDown,
MouseUp
}
写一个画文字的函数:
protected void DrawString(string strText,Graphics g)
{
StringFormat sf=new StringFormat();
sf.LineAlignment=StringAlignment.Center;
sf.Alignment=StringAlignment.Center;
g.DrawString(strText,this.Font,new SolidBrush(Color.Blue),this.ClientRectangle,sf);
}
填充按钮颜色及画边框颜色:
protected void DrawBorder(Status status,Graphics g)
{
Pen[] MousePen=new Pen[4];//定义四支笔
MousePen[(int)Status.MouseDown]=new Pen(_MouseDownBorderColor,2);
MousePen[(int)Status.MouseEnter]=new Pen(_MouseEnterBorderColor,2);
MousePen[(int)Status.MouseLeave]=new Pen(_MouseLeaveBorderColor,2);
MousePen[(int)Status.MouseUp]=new Pen(_MouseUpBorderColor,2);
SolidBrush[] MouseBrush=new SolidBrush[4];//定义四个笔刷
MouseBrush[(int)Status.MouseDown]=new SolidBrush(_MouseDownColor);
MouseBrush[(int)Status.MouseEnter]=new SolidBrush(_MouseEnterColor);
MouseBrush[(int)Status.MouseLeave]=new SolidBrush(_MouseLeaveColor);
MouseBrush[(int)Status.MouseUp]=new SolidBrush(_MouseUpColor);
switch(status)
{
case Status.MouseDown:
g.FillRectangle(MouseBrush[(int)Status.MouseDown],this.ClientRectangle);
g.DrawRectangle(MousePen[(int)Status.MouseDown],this.ClientRectangle);
break;
case Status.MouseEnter:
g.FillRectangle(MouseBrush[(int)Status.MouseEnter],this.ClientRectangle);
g.DrawRectangle(MousePen[(int)Status.MouseEnter],this.ClientRectangle);
break;
case Status.MouseLeave:
g.FillRectangle(MouseBrush[(int)Status.MouseLeave],this.ClientRectangle);
g.DrawRectangle(MousePen[(int)Status.MouseLeave],this.ClientRectangle);
break;
case Status.MouseUp:
g.FillRectangle(MouseBrush[(int)Status.MouseUp],this.ClientRectangle);
g.DrawRectangle(MousePen[(int)Status.MouseUp],this.ClientRectangle);
break;
}
for(int i=0;i<4;i++)
{
MousePen[i].Dispose();
MouseBrush[i].Dispose();
}
}
重载OnPaint()事件: