** 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() 事件:
protected override void OnPaint(PaintEventArgs e)
{
base .OnPaint (e);
Graphics g=e.Graphics;
switch (MouseStatus)
{
case Status.MouseDown:
this .DrawBorder(Status.MouseDown,g);
this .DrawString( this .Text,g);
break ;
case Status.MouseEnter:
this .DrawBorder(Status.MouseEnter,g);
this .DrawString( this .Text,g);
break ;
case Status.MouseLeave:
this .DrawBorder(Status.MouseLeave,g);
this .DrawString( this .Text,g);
break ;
case Status.MouseUp:
this .DrawBorder(Status.MouseUp,g);
this .DrawString( this .Text,g);
break ;
}
}
基本的函数就是这样了,无外乎就是画边框,然后填充颜色。当我们重载了 OnPaint() 事件后,也就等于把按钮的外观绘制权交到了自己的手里,你想怎么画就怎么画啦。
以下是程序的所有源码,新建一个 Windows 控件库,把代码复制过去就 OK !
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
namespace LzhButton
{
///
1<summary>
2
3/// UserControl1 的摘要说明。
4
5/// </summary>
public class ButtonLzh : System.Windows.Forms.Button
{
private Color _MouseEnterColor;
private Color _MouseLeaveColor;
private Color _MouseDownColor;
private Color _MouseUpColor;
private Color _MouseEnterBorderColor;
private Color _MouseLeaveBorderColor;
private Color _MouseDownBorderColor;
private Color _MouseUpBorderColor;
private Status MouseStatus;
[Description( "鼠标进入控件内的颜色" ),Category( "Appearance" )]
public Color MouseEnterColor
{
get
{
return _MouseEnterColor;
}
set
{
_MouseEnterColor= value ;
}
}
[Description( "鼠标移出控件外的颜色" ),Category( "Appearance" )]
public Color MouseLeaveColor
{
get
{