zoukankan      html  css  js  c++  java
  • 【转】C#使用GDI+制作背景颜色淡入淡出效果的按钮

    C#使用GDI+制作背景颜色淡入淡出效果的按钮

    2010-04-14  来自:CNBLOG  字体大小:【  
    • 摘要:本文介绍C#使用GDI+制作背景颜色淡入淡出效果的按钮,并提供完整的示例和源码供下载。

    用过QQ2009的网友都知道QQ主面板的界面非常炫丽,特别好看,鼠标移上去还有淡入淡出的效果。那这样效果是怎么做出来的呢?其实不难,只要自定义一个用户控件的外怪就可以了,用到GDI+技术和时钟控件来操作

    首先我们在VS2008里面新建一个Windows窗体控件库的项目,系统会自动生成一个用户控件UserControl1.cs出来,我们就用默认的名字吧~~

    本例子下载地址:https://files.cnblogs.com/mengxin523/自定义按钮控件.rar

    程序所有代码如下:

    using System;

    using System.Data;

    using System.Drawing;

    using System.Collections;

    using System.Windows.Forms;

    using System.ComponentModel;

    using System.Drawing.Drawing2D;



    namespace MyButton

    {

    public partial class UserControl1 : UserControl

    {

    private bool calledbykey = false;

    private State mButtonState = State.None; //按钮的状态

    private Timer mFadeIn = new Timer(); //淡入的时钟

    private Timer mFadeOut = new Timer(); //淡出的时钟

    private int mGlowAlpha = 0; //透明度

    private System.ComponentModel.Container components = null;

    public UserControl1()

    {

    InitializeComponent();

    //一下几个语句是对控件进行设置和对GDI+进行优化

    this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

    this.SetStyle(ControlStyles.DoubleBuffer, true);

    this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

    this.SetStyle(ControlStyles.ResizeRedraw, true);

    this.SetStyle(ControlStyles.Selectable, true);

    this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);

    this.SetStyle(ControlStyles.UserPaint, true);

    this.UpdateStyles();

    this.BackColor = Color.Transparent; //设置控件背景色透明

    mFadeIn.Interval
    = 20; //淡入速度

    mFadeOut.Interval
    = 20; //淡出速度

    }


    protected override void Dispose(bool disposing)

    {

    if (disposing)

    {

    if (components != null)

    {

    components.Dispose();

    }


    }


    base.Dispose(disposing);

    }


    private void InitializeComponent()

    {

    this.Name = "MySystemButton";

    this.Size = new System.Drawing.Size(100, 32);

    this.Paint += new System.Windows.Forms.PaintEventHandler(this.VistaButton_Paint);

    this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.VistaButton_KeyUp);

    this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.VistaButton_KeyDown);

    this.MouseEnter += new System.EventHandler(this.VistaButton_MouseEnter);

    this.MouseLeave += new System.EventHandler(this.VistaButton_MouseLeave);

    this.MouseUp += new MouseEventHandler(VistaButton_MouseUp);

    this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.VistaButton_MouseDown);

    this.GotFocus += new EventHandler(VistaButton_MouseEnter);

    this.LostFocus += new EventHandler(VistaButton_MouseLeave);

    this.mFadeIn.Tick += new EventHandler(mFadeIn_Tick);

    this.mFadeOut.Tick += new EventHandler(mFadeOut_Tick);

    this.Resize += new EventHandler(VistaButton_Resize);

    }


    enum State { None, Hover, Pressed };

    /// <summary>

    /// 按钮的样式

    /// </summary>


    public enum Style

    {

    /// <summary>

    /// Draw the button as normal

    /// </summary>


    Default,

    /// <summary>

    /// Only draw the background on mouse over.

    /// </summary>


    Flat

    }
    ;

    /// <summary>

    /// 用于设置按钮的用处

    /// </summary>


    public enum UseTo

    {

    Min, Close

    }
    ;

    UseTo Ut
    = UseTo.Close; //默认作为关闭按钮

    [Category(
    "UseTo"),

    DefaultValue(UseTo.Close),

    Browsable(
    true),

    Description(
    "设置按钮的用处")]

    public UseTo UT

    {

    get

    {

    return Ut;

    }


    set

    {

    Ut
    = value;

    this.Invalidate();

    }


    }


    private string mText;

    /// <summary>

    /// 按钮上显示的文本

    /// </summary>


    [Category(
    "Text"),

    Description(
    "按钮上显示的文本.")]

    public string ButtonText

    {

    get { return mText; }

    set { mText = value; this.Invalidate(); }

    }


    private Color mForeColor = Color.White;

    /// <summary>

    /// 文本颜色

    /// </summary>


    [Category(
    "Text"),

    Browsable(
    true),

    DefaultValue(
    typeof(Color), "White"),

    Description(
    "文本颜色.")]

    public override Color ForeColor

    {

    get { return mForeColor; }

    set { mForeColor = value; this.Invalidate(); }

    }


    private ContentAlignment mTextAlign = ContentAlignment.MiddleCenter;

    /// <summary>

    /// 文本对齐方式

    /// </summary>


    [Category(
    "Text"),

    DefaultValue(
    typeof(ContentAlignment), "MiddleCenter")]

    public ContentAlignment TextAlign

    {

    get { return mTextAlign; }

    set { mTextAlign = value; this.Invalidate(); }

    }


    private Image mImage;

    /// <summary>

    按钮上的图片

    /// </summary>

    [Category(
    "Image"),

    DefaultValue(
    null)]

    public Image Image

    {

    get { return mImage; }

    set { mImage = value; this.Invalidate(); }

    }




    private ContentAlignment mImageAlign = ContentAlignment.MiddleLeft;

    /// <summary>

    按钮对齐方式

    /// </summary>

    [Category(
    "Image"),

    DefaultValue(
    typeof(ContentAlignment), "MiddleLeft")]

    public ContentAlignment ImageAlign

    {

    get { return mImageAlign; }

    set { mImageAlign = value; this.Invalidate(); }

    }


    private Size mImageSize = new Size(24, 24);

    /// <summary>

    图片大小

    /// </summary>

    [Category(
    "Image"),

    DefaultValue(
    typeof(Size), "24, 24")]

    public Size ImageSize

    {

    get { return mImageSize; }

    set { mImageSize = value; this.Invalidate(); }

    }






    private Style mButtonStyle = Style.Default;

    /// <summary>

    按钮的样式

    /// </summary>

    [Category(
    "Appearance"),

    DefaultValue(
    typeof(Style), "Default")]

    public Style ButtonStyle

    {

    get { return mButtonStyle; }

    set { mButtonStyle = value; this.Invalidate(); }

    }




    private int mCornerRadius = 3;

    /// <summary>

    按钮边角的曲度

    /// </summary>

    [Category(
    "Appearance"),

    DefaultValue(
    8)]

    public int CornerRadius

    {

    get { return mCornerRadius; }

    set { mCornerRadius = value; this.Invalidate(); }

    }




    private Color mHighlightColor = Color.Gray;

    /// <summary>

    高亮的颜色

    /// </summary>

    [Category(
    "Appearance"),

    DefaultValue(
    typeof(Color), "White")]

    public Color HighlightColor

    {

    get { return mHighlightColor; }

    set { mHighlightColor = value; this.Invalidate(); }

    }


    private Color mButtonColor = Color.Black;

    /// <summary>

    /// The bottom color of the button that

    /// will be drawn over the base color.

    /// </summary>


    [Category(
    "Appearance"),

    DefaultValue(
    typeof(Color), "Black")]

    public Color ButtonColor

    {

    get { return mButtonColor; }

    set { mButtonColor = value; this.Invalidate(); }

    }




    private Color mGlowColor = Color.FromArgb(141, 189, 255);

    /// <summary>

    /// 鼠标移上去之后显示的颜色

    /// </summary>


    [Category(
    "Appearance"),

    DefaultValue(
    typeof(Color), "141,189,255")]

    public Color GlowColor

    {

    get { return mGlowColor; }

    set { mGlowColor = value; this.Invalidate(); }

    }


    private Image mBackImage;

    /// <summary>

    背景图片

    /// </summary>

    [Category(
    "Appearance"),

    DefaultValue(
    null)]

    public Image BackImage

    {

    get { return mBackImage; }

    set { mBackImage = value; this.Invalidate(); }

    }




    private static Color mBaseColor = Color.Black;

    /// <summary>

    /// The backing color that the rest of

    /// the button is drawn. For a glassier

    /// effect set this property to Transparent.

    /// </summary>


    [Category(
    "Appearance"),

    DefaultValue(
    typeof(Color), "Black")]

    public Color BaseColor

    {

    get { return mBaseColor; }

    set { mBaseColor = value; this.Invalidate(); }

    }


    /// <summary>

    /// 按钮的形状

    /// </summary>

    /// <param name="r"></param>

    /// <param name="r1"></param>

    /// <param name="r2"></param>

    /// <param name="r3"></param>

    /// <param name="r4"></param>

    /// <returns></returns>


    private GraphicsPath RoundRect(RectangleF r, float r1, float r2, float r3, float r4)

    {

    float x = r.X, y = r.Y, w = r.Width, h = r.Height;

    GraphicsPath rr
    = new GraphicsPath();

    rr.AddBezier(x, y
    + r1, x, y, x + r1, y, x + r1, y);

    rr.AddLine(x
    + r1, y, x + w - r2, y);

    rr.AddBezier(x
    + w - r2, y, x + w, y, x + w, y + r2, x + w, y + r2);

    rr.AddLine(x
    + w, y + r2, x + w, y + h - r3);

    rr.AddBezier(x
    + w, y + h - r3, x + w, y + h, x + w - r3, y + h, x + w - r3, y + h);

    rr.AddLine(x
    + w - r3, y + h, x + r4, y + h);

    rr.AddBezier(x
    + r4, y + h, x, y + h, x, y + h - r4, x, y + h - r4);

    rr.AddLine(x, y
    + h - r4, x, y + r1);

    return rr;

    }


    /// <summary>

    /// 对齐方式

    /// </summary>

    /// <param name="textalign"></param>

    /// <returns></returns>


    private StringFormat StringFormatAlignment(ContentAlignment textalign)

    {

    StringFormat sf
    = new StringFormat();

    switch (textalign)

    {

    case ContentAlignment.TopLeft:

    case ContentAlignment.TopCenter:

    case ContentAlignment.TopRight:

    sf.LineAlignment
    = StringAlignment.Near;

    break;

    case ContentAlignment.MiddleLeft:

    case ContentAlignment.MiddleCenter:

    case ContentAlignment.MiddleRight:

    sf.LineAlignment
    = StringAlignment.Center;

    break;

    case ContentAlignment.BottomLeft:

    case ContentAlignment.BottomCenter:

    case ContentAlignment.BottomRight:

    sf.LineAlignment
    = StringAlignment.Far;

    break;

    }


    switch (textalign)

    {

    case ContentAlignment.TopLeft:

    case ContentAlignment.MiddleLeft:

    case ContentAlignment.BottomLeft:

    sf.Alignment
    = StringAlignment.Near;

    break;

    case ContentAlignment.TopCenter:

    case ContentAlignment.MiddleCenter:

    case ContentAlignment.BottomCenter:

    sf.Alignment
    = StringAlignment.Center;

    break;

    case ContentAlignment.TopRight:

    case ContentAlignment.MiddleRight:

    case ContentAlignment.BottomRight:

    sf.Alignment
    = StringAlignment.Far;

    break;

    }


    return sf;

    }


    /// <summary>

    /// 画出按钮的外框线条

    /// </summary>

    /// <param name="g">The graphics object used in the paint event.</param>


    private void DrawOuterStroke(Graphics g)

    {

    if (this.ButtonStyle == Style.Flat && this.mButtonState == State.None) { return; }

    Rectangle r
    = this.ClientRectangle;

    r.Width
    -= 1; r.Height -= 1;

    using (GraphicsPath rr = RoundRect(r, CornerRadius, CornerRadius, CornerRadius, CornerRadius)) //圆角矩形

    {

    using (Pen p = new Pen(this.ButtonColor))

    {

    g.DrawPath(p, rr);
    //画出外框

    }


    }


    }




    /// <summary>

    /// 画出按钮的内框线条

    /// </summary>

    /// <param name="g">The graphics object used in the paint event.</param>


    private void DrawInnerStroke(Graphics g)

    {

    if (this.ButtonStyle == Style.Flat && this.mButtonState == State.None) { return; }

    Rectangle r
    = this.ClientRectangle;

    r.X
    ++; r.Y++;

    r.Width
    -= 3; r.Height -= 3;

    using (GraphicsPath rr = RoundRect(r, CornerRadius, CornerRadius, CornerRadius, CornerRadius))

    {

    using (Pen p = new Pen(this.HighlightColor))

    {

    g.DrawPath(p, rr);

    }


    }


    }




    /// <summary>

    /// 画出按钮的背景

    /// </summary>

    /// <param name="g">The graphics object used in the paint event.</param>


    private void DrawBackground(Graphics g)

    {

    if (this.ButtonStyle == Style.Flat && this.mButtonState == State.None) { return; }

    int alpha = (mButtonState == State.Pressed) ? 204 : 127;

    Rectangle r
    = this.ClientRectangle;

    r.Width
    --; r.Height--;

    using (GraphicsPath rr = RoundRect(r, CornerRadius, CornerRadius, CornerRadius, CornerRadius))

    {

    using (SolidBrush sb = new SolidBrush(this.BaseColor))

    {

    g.FillPath(sb, rr);

    }


    if (this.BackImage != null) { g.DrawImage(this.BackImage, this.ClientRectangle); }

    g.ResetClip();

    using (SolidBrush sb = new SolidBrush(Color.FromArgb(alpha, this.ButtonColor)))

    {

    g.FillPath(sb, rr);

    }


    }


    }




    /// <summary>

    /// 画出按钮的上半部分高光颜色

    /// </summary>

    /// <param name="g">The graphics object used in the paint event.</param>


    private void DrawHighlight(Graphics g)

    {

    if (this.ButtonStyle == Style.Flat && this.mButtonState == State.None) { return; }

    int alpha = (mButtonState == State.Pressed) ? 60 : 150;

    Rectangle rect
    = new Rectangle(0, 0, this.Width, this.Height / 2);

    using (GraphicsPath r = RoundRect(rect, CornerRadius, CornerRadius, 0, 0))

    {

    using (LinearGradientBrush lg = new LinearGradientBrush(r.GetBounds(),

    Color.FromArgb(alpha,
    this.HighlightColor),

    Color.FromArgb(alpha
    / 3, this.HighlightColor),

    LinearGradientMode.Vertical))

    {

    g.FillPath(lg, r);

    }


    }


    }




    /// <summary>

    /// 当鼠标移上去的时候的炫光

    /// </summary>

    /// <param name="g">The graphics object used in the paint event.</param>


    private void DrawGlow(Graphics g)

    {

    if (this.mButtonState == State.Pressed) { return; }

    using (GraphicsPath glow = new GraphicsPath())

    {

    Rectangle r
    = this.ClientRectangle;

    //r.Width -= 3; r.Height -= 3;

    glow.AddPath(RoundRect(
    new Rectangle(r.Left + 1, r.Top + 1, r.Width - 3, r.Height - 3), CornerRadius, CornerRadius, CornerRadius, CornerRadius), true);

    using (GraphicsPath gp = RoundRect(new Rectangle(r.Left + 1, r.Top + 1, r.Width - 3, r.Height / 2 - 2), CornerRadius, CornerRadius, CornerRadius, CornerRadius))

    {

    Color c
    = Color.FromArgb(mGlowAlpha, this.GlowColor);

    Color c1
    = Color.FromArgb(mGlowAlpha / 2 + 50, Color.White);

    using (SolidBrush sb = new SolidBrush(c))

    {

    using (SolidBrush sb1 = new SolidBrush(c1))

    {

    g.FillPath(sb, glow);

    g.FillPath(sb1, gp);

    }


    }


    }


    }


    g.ResetClip();

    }


    /// <summary>

    /// 显示按钮的文本

    /// </summary>

    /// <param name="g">The graphics object used in the paint event.</param>


    private void DrawText(Graphics g)

    {

    StringFormat sf
    = StringFormatAlignment(this.TextAlign);

    Rectangle r
    = new Rectangle(8, 8, this.Width - 17, this.Height - 17);

    g.DrawString(
    this.ButtonText, this.Font, new SolidBrush(this.ForeColor), r, sf);

    }


    /// <summary>

    /// 画出按钮上的图标

    /// </summary>

    /// <param name="g"></param>


    private void DrawIcon(Graphics g)

    {

    if (this.UT == UseTo.Close)

    {

    //关闭图片

    }


    else if (this.UT == UseTo.Min)

    {

    //最小化的图片

    }


    }


    private void VistaButton_Paint(object sender, PaintEventArgs e)

    {

    Graphics g
    = e.Graphics;

    g.SmoothingMode
    = SmoothingMode.AntiAlias;

    g.InterpolationMode
    = InterpolationMode.HighQualityBicubic;

    DrawBackground(g);

    DrawHighlight(g);

    DrawGlow(g);

    DrawIcon(g);

    DrawInnerStroke(g);

    }


    private void VistaButton_Resize(object sender, EventArgs e)

    {

    Rectangle r
    = this.ClientRectangle;

    r.X
    -= 1; r.Y -= 1;

    r.Width
    += 2; r.Height += 2;

    using (GraphicsPath rr = RoundRect(r, CornerRadius, CornerRadius, CornerRadius, CornerRadius))

    {

    this.Region = new Region(rr);

    }


    }


    private void VistaButton_MouseEnter(object sender, EventArgs e)

    {

    mButtonState
    = State.Hover;

    mFadeOut.Stop();

    mFadeIn.Start();

    }


    private void VistaButton_MouseLeave(object sender, EventArgs e)

    {

    mButtonState
    = State.None;

    if (this.mButtonStyle == Style.Flat) { mGlowAlpha = 0; }

    mFadeIn.Stop();

    mFadeOut.Start();

    }




    private void VistaButton_MouseDown(object sender, MouseEventArgs e)

    {

    if (e.Button == MouseButtons.Left)

    {

    mButtonState
    = State.Pressed;

    if (this.mButtonStyle != Style.Flat) { mGlowAlpha = 255; }

    mFadeIn.Stop();

    mFadeOut.Stop();

    this.Invalidate();

    }


    }




    private void mFadeIn_Tick(object sender, EventArgs e)

    ...



    private void mFadeOut_Tick(object sender, EventArgs e)

    ...



    private void VistaButton_KeyDown(object sender, KeyEventArgs e)

    ...



    private void VistaButton_KeyUp(object sender, KeyEventArgs e)

    ...



    private void VistaButton_MouseUp(object sender, MouseEventArgs e)

    ...

    }


    }
    作者:梦心
    作者:Asion Tang
    凡是没有注明[转载]的文章,本Blog发表的文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    新建一个类并绑定一个activity
    关于fragment保存变量的问题
    关于使用别人方法的效率问题
    使用asynctask的问题
    关于整个头像更新问题(2)
    关于查找所需代码的问题
    静态变量的使用问题
    关于更换头像的整个过程理解
    fill_parent 和 match_parent区别
    关于ui修改的若干想法
  • 原文地址:https://www.cnblogs.com/AsionTang/p/1741511.html
Copyright © 2011-2022 走看看