最新消息:本站全面升级HTTPS~~

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

C# 锋哥 12003浏览 0评论

项目越来越紧,我也乐此不疲。自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西。我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用。所以只要能满足需求就可以,比较高端先进的技术也没有时间去学习研究。
OK继续上次的内容。上次说到制作文本框,今天要写的是怎么实现水晶按钮的制作。下面是效果图:
20131018133250
下面是这个按钮所需要的图片素材,该素材也提取自360安全卫士。我自己做了一点点小的修改(另存为图片就可以使用):
Toolbar_Hover
一、嵌入资源
将以上素材另存为,将图片保存在解决方案中Images目录下的ButtonImages文件夹中,并设置图片属性中生成操作选择为“嵌入的资源”。
20131018133753
二、添加控件
资源嵌入之后再在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="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
}

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

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (9)

  1. 很棒 😮
    爱控客5年前 (2013-11-24)回复
  2. 我喜欢·····
    我也是瘦子5年前 (2013-12-03)回复
  3. 支持胖哥·····我正喜欢360皮肤界面,嘻嘻············不知道没有代码下载学习,谢谢你咯····支持····
    回首难忘5年前 (2013-12-03)回复
    • 那些主要的代码都已经在文章中间发布了,如果想要源码的话,我等这阵子忙完了再发。
      胖子5年前 (2013-12-04)回复
      • 求源码
        牧羊人5年前 (2013-12-11)回复
  4. 不错,把源码打个包发上来让我们学习学习
    胖zi5年前 (2014-03-05)回复
  5. 能否提供源码么?好想学学
    不是吧~~~~5年前 (2014-06-27)回复
  6. 可否分享一下源码...
    Code小生4年前 (2014-12-30)回复
  7. 很好,希望有源码例程可以学习
    手插口袋9个月前 (03-22)回复

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册