C#制作高仿360安全卫士窗体(四)- 水晶按钮

20131018133250
Toolbar_Hover
20131018133753

项目越来越紧,我也乐此不疲。自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西。我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用。所以只要能满足需求就可以,比较高端先进的技术也没有时间去学习研究。
OK继续上次的内容。上次说到制作文本框,今天要写的是怎么实现水晶按钮的制作。下面是效果图:

下面是这个按钮所需要的图片素材,该素材也提取自360安全卫士。我自己做了一点点小的修改(另存为图片就可以使用):

一、嵌入资源
将以上素材另存为,将图片保存在解决方案中Images目录下的ButtonImages文件夹中,并设置图片属性中生成操作选择为“嵌入的资源”。

二、添加控件
资源嵌入之后再在ControlEx目录中建立一个名为GlassButton的文件夹用来存放该控件的代码。再在该目录中建立一个名为GlassButton的用户控件
三、编码
和之前的控件一样,最开始先把该控件拥有的状态定义出来,这里我定义了四种状态:

#region 控件状态
/// <summary>
/// 控件状态
/// </summary>
public enum State
{
    /// <summary>
    /// 无
    /// </summary>
    Normal = 0,
    /// <summary>
    /// 获得焦点
    /// </summary>
    Focused = 1,
    /// <summary>
    /// 失去焦点
    /// </summary>
    LostFocused = 2,
    /// <summary>
    /// 鼠标指针进入控件
    /// </summary>
    MouseEnter = 3
}
#endregion

下面是该控件的所有代码和之前基本一样:

/// <summary>
/// Toolbar控件
/// </summary>
public class GlassButton : Control
{
    #region 私有变量
    private int bmp_Left;
    private const int bmp_Top = 6;
    private const int bmp_Size = 48;
    private bool _focused = false;
    private State state = State.Normal;
    public Bitmap _BackImg = ImageObject.GetResBitmap("FANGSI.UI.Images.ButtonImages.Toolbar_Hover.png");

    private Bitmap _bmp = null;
    #endregion

    #region 构造函数
    public GlassButton()
    {
        try
        {
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.SetStyle(ControlStyles.StandardDoubleClick, false);
            this.SetStyle(ControlStyles.Selectable, true);
            ResizeRedraw = true;
            BackColor = Color.Transparent;
            ForeColor = Color.White;//初始文本颜色
            Size = new Size(80, 75);//初始大小
            Font = new Font("微软雅黑", 9, System.Drawing.FontStyle.Bold);//控件字体
        }
        catch { }
    }
    #endregion

    #region 属性
    /// <summary>
    /// 获取或设置控件显示的图片
    /// </summary>

    [CategoryAttribute("放肆雷特扩展属性"), Description("获取或设置控件显示的图标")]
    public Bitmap Bitmap
    {
        get { return _bmp; }
        set
        {
            _bmp = value;
            Invalidate(false);
        }
    }

    /// <summary>
    /// 重写控件焦点属性
    /// </summary>
    [CategoryAttribute("放肆雷特扩展属性"), Description("重写控件焦点属性")]
    public new bool Focused
    {
        get { return _focused; }
        set
        {
            _focused = value;

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

            Invalidate(false);
        }
    }
    #endregion

    #region 重载事件
    //自定义绘制
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        Graphics g = e.Graphics;
        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);
                        ImageDrawRect.DrawRect(g, _BackImg, ClientRectangle, 1, 2);
                    else
                        DrawSelected(g);
                    break;
                }
        }

        DrawImage(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 = 80;
        Height = 75;
    }

    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)
    {
        ImageDrawRect.DrawRect(g, _BackImg, ClientRectangle, 2, 2);
    }

    void DrawImage(Graphics g)
    {
        if (_bmp != null)
        {
            Bitmap bmp = ScaleZoom(_bmp);
            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, 55);
    }
    #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="bmpWidth">缩放图片的大小</param>
    /// <param name="bmpHeight">缩放的图片</param>
    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
}

编译通过后即可在工具箱中使用,图标需要自己去找。至此360高仿安全卫士系列文章已经基本完了。没有写什么,就主要记录一下自己的开发历程。过几天整理源码上传上来,给大家下载使用。

本博客所有文章如无特别注明均为原创

如果觉得对你有帮助,可以通过下方打赏对作者表示鼓励

本文采用知识共享署名-非商业性使用-相同方式共享

如若转载,请注明出处:《C#制作高仿360安全卫士窗体(四)- 水晶按钮》https://www.fangsi.net/593.html

(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
锋哥的头像锋哥管理员
上一篇 2013年10月17日 11:47
下一篇 2013年11月7日 18:00

相关推荐

回复 不是吧~~~~

登录后才能评论

评论列表(9条)

  • 手插口袋
    手插口袋 2018年3月22日 15:43

    很好,希望有源码例程可以学习

  • Code小生
    Code小生 2014年12月30日 15:56

    可否分享一下源码…

  • 不是吧~~~~
    不是吧~~~~ 2014年6月27日 16:34

    能否提供源码么?好想学学

  • 胖zi
    胖zi 2014年3月5日 17:07

    不错,把源码打个包发上来让我们学习学习

  • 回首难忘
    回首难忘 2013年12月3日 21:38

    支持胖哥·····我正喜欢360皮肤界面,嘻嘻············不知道没有代码下载学习,谢谢你咯····支持····

    • 胖子的头像
      锋哥 2013年12月4日 08:29

      @回首难忘那些主要的代码都已经在文章中间发布了,如果想要源码的话,我等这阵子忙完了再发。

    • 牧羊人
      牧羊人 2013年12月11日 16:25

      @锋哥求源码

  • 我也是瘦子
    我也是瘦子 2013年12月3日 20:26

    我喜欢·····

  • 爱控客
    爱控客 2013年11月24日 10:46

    很棒 :eek: