• 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
        }
    }
  • 相关阅读:
    十七、mysql数据库备份
    消费端ACK和重回队列
    RabbitMQ TTL、死信队列
    消费端限流策略
    029异常处理
    028class_part2
    027class_part1
    026json和pickle,xml模块
    025__name__变量和目录结构规范
    024模块的概念
  • 原文地址:https://www.cnblogs.com/riskyer/p/3228703.html
Copyright © 2020-2023  润新知