C#模仿360安全卫士玻璃按钮,不闪烁,背景切换效率快

首先先上效果图:


1.准备两张透明的png图片(尺寸74 x 82),一张用于鼠标进入控件时显示,一张用于鼠标单击控件时显示

2.拖一个GlassButton按钮

3.设置按钮属性

this.btnEmailCount.BackColor = System.Drawing.Color.Transparent;
this.btnEmailCount.FlatAppearance.BorderSize = 0;
this.btnEmailCount.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent;
this.btnEmailCount.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
this.btnEmailCount.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnEmailCount.Font = new System.Drawing.Font("微软雅黑", 9F);
this.btnEmailCount.ForeColor = System.Drawing.Color.White;
this.btnEmailCount.Icon = global::Com.Qisentech.Email.Properties.Resources.btn_email_count;
this.btnEmailCount.Location = new System.Drawing.Point(89, 27);
this.btnEmailCount.Name = "btnEmailCount";
this.btnEmailCount.Size = new System.Drawing.Size(73, 81);
this.btnEmailCount.TabIndex = 15;
this.btnEmailCount.Text = "邮件统计";
this.btnEmailCount.UseVisualStyleBackColor = false;
this.btnEmailCount.Click += new System.EventHandler(this.btnEmailCount_Click);

下面奉上GlassButton的源码

using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using Com.Qisentech.Controls.Methods;

namespace Com.Qisentech.Controls.QQControls
{
    #region//控件状态
    /// <summary>
    /// 控件状态
    /// </summary>
    public enum State
    {
        /// <summary>
        /// 无
        /// </summary>
        Normal = 0,
        /// <summary>
        /// 获得焦点
        /// </summary>
        Focused = 1,
        /// <summary>
        /// 失去焦点
        /// </summary>
        LostFocused = 2,
        /// <summary>
        /// 鼠标指针进入控件
        /// </summary>
        MouseEnter = 3
    }
    #endregion
    public class  	 : Button
    {
        #region//私有变量
        private int bmp_Left;
        private const int bmp_Top = 5;
        private const int bmp_Size = 45;
        private bool _focused = false;
        private State state = State.Normal;

        private Bitmap _icon = Properties.Resources.icon;
        private string _text = null;

        #endregion

        #region//构造函数
        public GlassButton()
        {
            SetStyle(ControlStyles.AllPaintingInWmPaint |
                ControlStyles.DoubleBuffer |
                ControlStyles.OptimizedDoubleBuffer, true);               //双缓冲防止重绘时闪烁
            SetStyle(ControlStyles.UserPaint, true);                      //自定义绘制控件内容
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);   //模拟透明
            SetStyle(ControlStyles.Selectable, true);                     //接收焦点
            SetStyle(ControlStyles.ResizeRedraw, true);
            Size = new Size(74, 82);                                      //初始大小
            Font = new System.Drawing.Font("微软雅黑", 9F);               //控件字体

            BackColor = System.Drawing.Color.Transparent;
            FlatAppearance.BorderSize = 0;
            FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent;
            FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
            FlatStyle = System.Windows.Forms.FlatStyle.Flat;
            ForeColor = System.Drawing.Color.White;
            UseVisualStyleBackColor = false;
            Text = "玻璃按钮1";

        }
        #endregion

        #region//属性
        /// <summary>
        /// 获取或设置控件显示的图片
        /// </summary>
        [Description("获取或设置控件显示的图标")]
        public Bitmap Icon
        {
            get { return _icon; }
            set
            {
                _icon = value;
                Invalidate(false);
            }
        }

        /// <summary>
        /// 重写控件焦点属性
        /// </summary>
        [Description("重写控件焦点属性")]
        public new bool Focused
        {
            get { return _focused; }
            set
            {
                _focused = value;

                if (_focused)
                    state = State.Focused;
                else
                    state = State.LostFocused;

                Invalidate(false);
            }
        }

        /// <summary>
        /// 与控件关联的文本
        /// </summary>
        [Description("与控件关联的文本。"), DefaultValue(null)]
        public new string Text
        {
            get
            {
                return _text;
            }
            set
            {
                _text = value;
                Invalidate(false);
            }
        }
        #endregion

        #region//重载事件
        //自定义绘制
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            //g.DrawImage(_normalImg, ClientRectangle);
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;

            switch (state)
            {
                case State.Focused:
                    {
                        DrawSelected(g);
                        break;
                    }
                case State.MouseEnter:
                    {
                        if (!Focused)
                            g.DrawImage(Properties.Resources.enter, ClientRectangle);
                        else
                            DrawSelected(g);
                        break;
                    }
            }

            DrawIcon(g);
            DrawText(g);
        }

        //焦点进入
        protected override void OnEnter(EventArgs e)
        {
            base.OnEnter(e);
            Focused = true;
        }

        //失去焦点
        protected override void OnLeave(EventArgs e)
        {
            base.OnLeave(e);
            Focused = false;
        }

        //禁止调整大小
        protected override void OnResize(EventArgs e)
        {
            Width = 73;
            Height = 81;
        }

        protected override void OnMouseEnter(EventArgs e)
        {
            base.OnMouseEnter(e);
            state = State.MouseEnter;
            Invalidate(false);
        }

        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            if (!Focused)
            {
                state = State.LostFocused;
                Invalidate(false);
            }
        }

        //只响应单击鼠标左键事件
        protected override void OnClick(EventArgs e)
        {
            MouseEventArgs m = (MouseEventArgs)e;
            if (m.Button == MouseButtons.Left)
            {
                base.OnClick(e);
                Focus();
            }
        }
        #endregion

        #region//方法

        #region//Draw
        void DrawSelected(Graphics g)
        {
            g.DrawImage(Properties.Resources.down, ClientRectangle);
        }

        void DrawIcon(Graphics g)
        {
            if (_icon != null)
            {
                Bitmap bmp = ScaleZoom(_icon);
                bmp_Left = (Width - bmp.Width) / 2;
                g.DrawImage(bmp, new Rectangle(bmp_Left, bmp_Top, bmp.Width, bmp.Height));
            }
        }

        void DrawText(Graphics g)
        {
            SizeF size = g.MeasureString(_text, Font);
            g.DrawString(_text, Font, new SolidBrush(ForeColor), (Width - size.Width) / 2, 58);
        }
        #endregion

        #region//按比例缩放图片
        public Bitmap ScaleZoom(Bitmap bmp)
        {
            if (bmp != null)
            {
                double zoomScale;
                if (bmp.Width > bmp_Size || bmp.Height > bmp_Size)
                {
                    double imageScale = (double)bmp.Width / (double)bmp.Height;
                    double thisScale = 1;

                    if (imageScale > thisScale)
                    {
                        zoomScale = (double)bmp_Size / (double)bmp.Width;
                        return BitMapZoom(bmp, bmp_Size, (int)(bmp.Height * zoomScale));
                    }
                    else
                    {
                        zoomScale = (double)bmp_Size / (double)bmp.Height;
                        return BitMapZoom(bmp, (int)(bmp.Width * zoomScale), bmp_Size);
                    }
                }
            }
            return bmp;
        }
        #endregion

        #region//缩放BitMap
        /// <summary>
        /// 图片缩放
        /// </summary>
        /// <param name="bmpSource">源图片</param>
        /// <param name="bmpSize">缩放图片的大小</param>
        /// <returns>缩放的图片</returns>
        public Bitmap BitMapZoom(Bitmap bmpSource, int bmpWidth, int bmpHeight)
        {
            Bitmap bmp, zoomBmp;
            try
            {
                bmp = new Bitmap(bmpSource);
                zoomBmp = new Bitmap(bmpWidth, bmpHeight);
                Graphics gh = Graphics.FromImage(zoomBmp);
                gh.InterpolationMode = InterpolationMode.HighQualityBicubic;
                gh.DrawImage(bmp, new Rectangle(0, 0, bmpWidth, bmpHeight), 
                         new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
                gh.Dispose();
                return zoomBmp;
            }
            catch
            { }
            finally
            {
                bmp = null;
                zoomBmp = null;
                GC.Collect();
            }
            return null;
        }
        #endregion

        #endregion
    }
}
原文地址:https://www.cnblogs.com/riskyer/p/3228703.html