zoukankan      html  css  js  c++  java
  • SBButton

    介绍 SBButton控件是从一组控件(Sysbytes控件)中创建的一个按钮控件,用于我正在编写的应用程序。这个按钮控件几乎可以用户喜欢的任何方式定制。你可以为这个控件的不同状态使用不同的样式,例如:DefaultStyle, MouseOverStyle, MouseDownStyle和DisabledStyle。 它是如何工作的 此控件从控件类和IButtonControl接口继承,并使用OnPaint事件使用GDI+绘制控件。这个控件使用了一些与。net提供的按钮控件不同的属性。以下是它的特性: DefaultStyleMouseOverStyleMouseDownStyleDisabledStyleRoundedCornersShowFocusCueImageImageAlignmentFocusCueColor 属性DefaultStyle、MouseOverStyle、MouseDownStyle和DisabledStyle派生自一个名为SBButtonAppearance的类,而且所有这些属性都有一些通用的子属性。它们是: BackColor1BackColor2HighLightColorGlowColorInnerBorderColorOuterBorderColorTextColorFillModeFontHighLightOpacity1HighLightOpacity2GlowOpacityInnerBorderOpacity 源代码 源代码的sbbuttonappearance anceclass如下: 隐藏,收缩,复制Code

    [Serializable()]
    [TypeConverter(typeof(ExpandableObjectConverter))]
    public class SBButtonAppearance
    {
        public event EventHandler<EventArgs> SBButtonAppearanceChanged;
    
        private Color _backColor1 = SystemColors.ButtonFace;
    
        public Color BackColor1
        {
            get { return _backColor1; }
            set 
            {
                _backColor1 = value;
                AppearanceChanged();
            }
        }
    
        private Color _backColor2 = SystemColors.ButtonFace;
    
        public Color BackColor2
        {
            get { return _backColor2; }
            set 
            {
                _backColor2 = value;
                AppearanceChanged();
            }
        }
    
        private Color _outerBorderColor = SystemColors.ControlDarkDark;
    
        public Color OuterBorderColor
        {
            get { return _outerBorderColor; }
            set 
            {
                _outerBorderColor = value;
                AppearanceChanged();
            }
        }
    
        private Color _innerBorderColor = SystemColors.ControlLightLight;
    
        public Color InnerBorderColor
        {
            get { return _innerBorderColor; }
            set 
            {
                _innerBorderColor = value;
                AppearanceChanged();
            }
        }
    
        private Color _glowColor = SystemColors.ControlLightLight;
    
        public Color GlowColor
        {
            get { return _glowColor; }
            set 
            { 
                _glowColor = value;
                AppearanceChanged();
            }
        }
    
        private Color _highLightColor = SystemColors.ControlLightLight;
    
        public Color HighLightColor
        {
            get { return _highLightColor; }
            set 
            {
                _highLightColor = value;
                AppearanceChanged();
            }
        }
    
        private Color _textColor = SystemColors.ControlText;
    
        public Color TextColor
        {
            get { return _textColor; }
            set
            {
                _textColor = value;
                AppearanceChanged();
            }
        }
    
        private Font _font = SystemFonts.DefaultFont;
    
        public Font Font
        {
            get { return _font; }
            set
            {
                _font = value;
                AppearanceChanged();
            }
        }
    
        private LinearGradientMode _fillMode = LinearGradientMode.Horizontal;
    
        public LinearGradientMode FillMode
        {
            get { return _fillMode; }
            set
            {
                _fillMode = value;
                AppearanceChanged();
            }
        }
    
        private int _innerBorderOpacity = 200;
    
        public int InnerBorderOpacity
        {
            get { return _innerBorderOpacity; }
            set
            {
                if (value > 255) value = 255;
                if (value < 0) value = 0;
    
                _innerBorderOpacity = value;
                AppearanceChanged();
            }
        }
    
        private int _highLightOpacity1 = 200;
    
        public int HightLightOpacity1
        {
            get { return _highLightOpacity1; }
            set
            {
                if (value > 255) value = 255;
                if (value < 0) value = 0;
    
                _highLightOpacity1 = value;
                AppearanceChanged();
            }
        }
    
        private int _highLightOpacity2 = 150;
    
        public int HightLightOpacity2
        {
            get { return _highLightOpacity2; }
            set
            {
                if (value > 255) value = 255;
                if (value < 0) value = 0;
    
                _highLightOpacity2 = value;
                AppearanceChanged();
            }
        }
    
        private int _glowOpacity = 120;
    
        public int GlowOpacity
        {
            get { return _glowOpacity; }
            set
            {
                if (value > 255) value = 255;
                if (value < 0) value = 0;
    
                _glowOpacity = value;
                AppearanceChanged();
            }
        }
    
        public override string ToString()
        {
            return null;
        }
    
        private void AppearanceChanged()
        {
            EventHandler<EventArgs> temp = SBButtonAppearanceChanged;
            if (temp != null)
                temp(this, new EventArgs());
        }
    }

    绘制按钮代码: 隐藏,收缩,复制Code

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
        e.Graphics.TextRenderingHint =
          System.Drawing.Text.TextRenderingHint.SystemDefault;
    
        if(!isMouseIn && !isMouseDown && this.Enabled)
            this.DrawDefault(e);
    
        if (isMouseIn && !isMouseDown && this.Enabled)
            this.DrawMouseOver(e);
    
        if (isMouseIn && isMouseDown && this.Enabled)
            this.DrawMouseDown(e);
    
        if (!isMouseIn && isMouseDown && this.Enabled)
            this.DrawMouseDown(e);
    
        if (!this.Enabled)
            this.DrawDisabled(e);
    
        if (this.Focused && this.ShowFocusCue && this.Enabled)
            ControlPaint.DrawBorder(e.Graphics, new Rectangle(
                2, 2, this.Width - 4, this.Height - 4), this.FocusCueColor,
                ButtonBorderStyle.Dashed);
    }
    private void DrawDefault(PaintEventArgs e)
    {
        LinearGradientBrush brBackground = new LinearGradientBrush(
            this.ClientRectangle, this.DefaultStyle.BackColor1,
            this.DefaultStyle.BackColor2, this.DefaultStyle.FillMode);
        LinearGradientBrush brHighlight = new LinearGradientBrush(new Rectangle(
            2, 2, this.Width - 5, this.Height / 2),
            Color.FromArgb(this.DefaultStyle.HightLightOpacity1,
            this.DefaultStyle.HighLightColor),
            Color.FromArgb(this.DefaultStyle.HightLightOpacity2,
            this.DefaultStyle.HighLightColor), LinearGradientMode.Vertical);
        LinearGradientBrush brGlow = new LinearGradientBrush(new Rectangle(
            0, this.Height - this.Height / 4 - 1, this.Width - 1, this.Height / 4),
            Color.Transparent, Color.FromArgb(this.DefaultStyle.GlowOpacity,
            this.DefaultStyle.GlowColor), LinearGradientMode.Vertical);
    
        Pen pnOuterBorder = new Pen(this.DefaultStyle.OuterBorderColor, 1);
        Pen pnInnerBorder = new Pen(Color.FromArgb(DefaultStyle.InnerBorderOpacity,
            this.DefaultStyle.InnerBorderColor));
    
        GraphicsPath gpBackground = Common.RoundedRect(new Rectangle(
            0, 0, this.Width - 1, this.Height - 1), 3);
        GraphicsPath gpGlow = Common.RoundedRect(new Rectangle(
            1, this.Height - this.Height / 4, this.Width - 3, this.Height / 4), 1,1,3,3);
        GraphicsPath gpHighlight = Common.RoundedRect(new Rectangle(
            2, 2, this.Width - 5, this.Height / 2 - 1), 3, 3, 1, 1);
        GraphicsPath gpOuterBorder = Common.RoundedRect(new Rectangle(
            0, 0, this.Width - 1, this.Height - 1), 3);
        GraphicsPath gpInnerBorder = Common.RoundedRect(new Rectangle(
            1, 1, this.Width - 3, this.Height - 3), 3);
    
        Rectangle rectBackground = new Rectangle(0, 0, this.Width - 1, this.Height - 1);
        Rectangle rectGlow = new Rectangle(1, this.Height - this.Height / 4,
            this.Width - 3, this.Height / 4);
        Rectangle rectHighlight = new Rectangle(2, 2, this.Width - 5, this.Height / 2 - 1);
        Rectangle rectOuterBorder = new Rectangle(0, 0, this.Width - 1, this.Height - 1);
        Rectangle rectInnerBorder = new Rectangle(1, 1, this.Width - 3, this.Height - 3);
    
        Size textSize = TextRenderer.MeasureText(this.Text, this.DefaultStyle.Font);
    
        Point textPos = new Point(this.Width / 2 - textSize.Width / 2,
            this.Height / 2 - textSize.Height / 2);
        Point imagePos = new Point();
    
        switch (this.ImageAlignment)
        {
            case Alignment.Right:
                if (this.Image != null)
                {
                    textPos = new Point(5, this.Height / 2 - textSize.Height / 2);
                    imagePos = new Point(this.Width - this.Image.Width - 5,
                        this.Height / 2 - this.Image.Size.Height / 2);
                }
                break;
            case Alignment.Left:
                if (this.Image != null)
                {
                    textPos = new Point(this.Width - textSize.Width - 5,
                        this.Height / 2 - textSize.Height / 2);
                    imagePos = new Point(5, this.Height / 2 - this.Image.Size.Height / 2);
                }
                break;
        }
    
        if (this.RoundedCorners)
        {
            e.Graphics.FillPath(brBackground, gpBackground);
            e.Graphics.FillPath(brGlow, gpGlow);
            e.Graphics.FillPath(brHighlight, gpHighlight);
            e.Graphics.DrawPath(pnOuterBorder, gpOuterBorder);
            e.Graphics.DrawPath(pnInnerBorder, gpInnerBorder);
        }
        else
        {
            e.Graphics.FillRectangle(brBackground, rectBackground);
            e.Graphics.FillRectangle(brGlow, rectGlow);
            e.Graphics.FillRectangle(brHighlight, rectHighlight);
            e.Graphics.DrawRectangle(pnOuterBorder, rectOuterBorder);
            e.Graphics.DrawRectangle(pnInnerBorder, rectInnerBorder);
        }
    
        if (this.Image != null)
            e.Graphics.DrawImage(this.Image, imagePos.X, imagePos.Y,
                this.Image.Width, this.Image.Height);
    
        TextRenderer.DrawText(e.Graphics, this.Text, this.DefaultStyle.Font,
            textPos, this.DefaultStyle.TextColor);
    }
    

    方法DrawMouseOver、DrawMouseDown和DrawDisabled与DrawDefault相同,只是它们使用的颜色和不透明度值不同。您可能已经注意到,该方法调用了一个函数Common.RoundedRect。这个函数将返回一个带有圆角的矩形作为GraphicsPath。 下面是这个函数的代码: 隐藏,收缩,复制Code

    public static System.Drawing.Drawing2D.GraphicsPath RoundedRect(
        System.Drawing.Rectangle baseRect, int topLeftRadius,
        int topRightRadius, int bottomLeftRadius, int bottomRightRadius)
    {
        int topLeftDiameter = topLeftRadius * 2;
        int topRightDiameter = topRightRadius * 2;
        int bottomLeftDiameter = bottomLeftRadius * 2;
        int bottomRightDiameter = bottomRightRadius * 2;
    
        System.Drawing.Drawing2D.GraphicsPath gp =
               new System.Drawing.Drawing2D.GraphicsPath();
    
        System.Drawing.Rectangle rectTopLeft = new System.Drawing.Rectangle(
            baseRect.Left, baseRect.Top, topLeftDiameter, topLeftDiameter);
        System.Drawing.Rectangle rectTopRight = new System.Drawing.Rectangle(
            baseRect.Right - topRightDiameter, baseRect.Top, topRightDiameter,
            topRightDiameter);
        System.Drawing.Rectangle rectBottomLeft = new System.Drawing.Rectangle(
            baseRect.Left, baseRect.Bottom - bottomLeftDiameter, bottomLeftDiameter,
            bottomLeftDiameter);
        System.Drawing.Rectangle rectBottomRight = new System.Drawing.Rectangle(
            baseRect.Right - bottomRightDiameter, baseRect.Bottom - bottomRightDiameter,
            bottomRightDiameter, bottomRightDiameter);
    
        gp.AddArc(rectTopLeft, 180, 90);
        gp.AddArc(rectTopRight, 270, 90);
        gp.AddArc(rectBottomRight, 0, 90);
        gp.AddArc(rectBottomLeft, 90, 90);
    
        gp.CloseFigure();
    
        return gp;
    }
    public static System.Drawing.Drawing2D.GraphicsPath RoundedRect(
        System.Drawing.Rectangle baseRect, int cornerRadius)
    {
        int diameter = cornerRadius * 2;
    
        System.Drawing.Drawing2D.GraphicsPath gp =
               new System.Drawing.Drawing2D.GraphicsPath();
    
        System.Drawing.Rectangle rectTopLeft = new System.Drawing.Rectangle(
            baseRect.Left, baseRect.Top, diameter, diameter);
        System.Drawing.Rectangle rectTopRight = new System.Drawing.Rectangle(
            baseRect.Right - diameter, baseRect.Top, diameter, diameter);
        System.Drawing.Rectangle rectBottomLeft = new System.Drawing.Rectangle(
            baseRect.Left, baseRect.Bottom - diameter, diameter, diameter);
        System.Drawing.Rectangle rectBottomRight = new System.Drawing.Rectangle(
            baseRect.Right - diameter, baseRect.Bottom - diameter, diameter, diameter);
    
        gp.AddArc(rectTopLeft, 180, 90);
        gp.AddArc(rectTopRight, 270, 90);
        gp.AddArc(rectBottomRight, 0, 90);
        gp.AddArc(rectBottomLeft, 90, 90);
    
        gp.CloseFigure();
    
        return gp;
    }
    

    的兴趣点 此控件支持图像,并且只能向右或向左对齐。如果没有图像,文本将始终与控件的中心对齐。通过编辑DrawDefault、DrawMouseOver、DrawMouseDown和DrawDisabled这些方法,你可以非常容易地修改这些行为。 本文转载于:http://www.diyabc.com/frontweb/news446.html

  • 相关阅读:
    Java性能权威指南读书笔记--之二
    Java性能权威指南读书笔记--之一
    深入理解JVM-java字节码文件结构剖析(练习解读字节码)
    深入理解JVM-java字节码文件结构剖析(1)
    jvm(5)---垃圾回收(回收算法和垃圾收集器)
    jvm(4)---垃圾回收(哪些对象可以被回收)
    jvm(3)---常用监控工具指令
    jvm(2)---类加载机制
    jvm(1)---java内存结构
    Eureka客户端源码流程梳理
  • 原文地址:https://www.cnblogs.com/Dincat/p/13450109.html
Copyright © 2011-2022 走看看