FlatStyle按钮自己做

** 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

{

&nbsp

Published At
Categories with Web编程
Tagged with
comments powered by Disqus