• 【控件扩展】带圆角、边框、渐变的panel


    下载地址:  http://files.cnblogs.com/chengulv/custompanel_demo.zip

    using System;
    namespace LC.Fun
    {
    
    
        /// <summary>Panel扩展 带圆角,颜色渐变</summary>
        [System.Drawing.ToolboxBitmapAttribute(typeof(System.Windows.Forms.Panel))]
        public class RoundPanel : System.Windows.Forms.Panel
        {
            /// <summary>渐变的方向</summary>
            public enum LinearGradientMode
            {
                Horizontal = 0,
                Vertical = 1,
                ForwardDiagonal = 2,
                BackwardDiagonal = 3,
                None = 4
            }
    
            /// <summary>
            /// 圆角的位置
            /// </summary>
            [FlagsAttribute()]
            public enum CornerCurveMode
            {
                None = 0,
                TopLeft = 1,
                TopRight = 2,
                TopLeft_TopRight = 3,
                BottomLeft = 4,
                TopLeft_BottomLeft = 5,
                TopRight_BottomLeft = 6,
                TopLeft_TopRight_BottomLeft = 7,
                BottomRight = 8,
                BottomRight_TopLeft = 9,
                BottomRight_TopRight = 10,
                BottomRight_TopLeft_TopRight = 11,
                BottomRight_BottomLeft = 12,
                BottomRight_TopLeft_BottomLeft = 13,
                BottomRight_TopRight_BottomLeft = 14,
                All = 15
    
            }
    
            // Fields
            private System.Drawing.Color _BackColour1 = System.Drawing.SystemColors.Window;
            private System.Drawing.Color _BackColour2 = System.Drawing.SystemColors.Window;
            private LinearGradientMode _GradientMode = LinearGradientMode.None;
            private System.Windows.Forms.BorderStyle _BorderStyle = System.Windows.Forms.BorderStyle.None;
            private System.Drawing.Color _BorderColour = System.Drawing.SystemColors.WindowFrame;
            private int _BorderWidth = 1;
            private int _Curvature = 0;
            // Properties
            //   Shadow the Backcolor property so that the base class will still render with a transparent backcolor
            private CornerCurveMode _CurveMode = CornerCurveMode.All;
    
            [System.ComponentModel.DefaultValueAttribute(typeof(System.Drawing.Color), "Window"), System.ComponentModel.CategoryAttribute("自定义cx"), System.ComponentModel.DescriptionAttribute("背景色1")]
            public new System.Drawing.Color BackColor
            {
                get
                {
                    return this._BackColour1;
                }
                set
                {
                    this._BackColour1 = value;
                    if (this.DesignMode == true)
                    {
                        this.Invalidate();
                    }
                }
            }
    
            [System.ComponentModel.DefaultValueAttribute(typeof(System.Drawing.Color), "Window"), System.ComponentModel.CategoryAttribute("自定义cx"), System.ComponentModel.DescriptionAttribute("背景色2")]
            public System.Drawing.Color BackColor2
            {
                get
                {
                    return this._BackColour2;
                }
                set
                {
                    this._BackColour2 = value;
                    if (this.DesignMode == true)
                    {
                        this.Invalidate();
                    }
                }
            }
    
            [System.ComponentModel.DefaultValueAttribute(typeof(LinearGradientMode), "None"), System.ComponentModel.CategoryAttribute("自定义cx"), System.ComponentModel.DescriptionAttribute("颜色渐变的方向")]
            public LinearGradientMode GradientMode
            {
                get
                {
                    return this._GradientMode;
                }
                set
                {
                    this._GradientMode = value;
                    if (this.DesignMode == true)
                    {
                        this.Invalidate();
                    }
                }
            }
    
            [System.ComponentModel.DefaultValueAttribute(typeof(System.Windows.Forms.BorderStyle), "None"), System.ComponentModel.CategoryAttribute("自定义cx"), System.ComponentModel.DescriptionAttribute("边框的样式")]
            public new System.Windows.Forms.BorderStyle BorderStyle
            {
                get
                {
                    return this._BorderStyle;
                }
                set
                {
                    this._BorderStyle = value;
                    if (this.DesignMode == true)
                    {
                        this.Invalidate();
                    }
                }
            }
    
            [System.ComponentModel.DefaultValueAttribute(typeof(System.Drawing.Color), "WindowFrame"), System.ComponentModel.CategoryAttribute("自定义cx"), System.ComponentModel.DescriptionAttribute("边框的颜色")]
            public System.Drawing.Color BorderColor
            {
                get
                {
                    return this._BorderColour;
                }
                set
                {
                    this._BorderColour = value;
                    if (this.DesignMode == true)
                    {
                        this.Invalidate();
                    }
                }
            }
    
            [System.ComponentModel.DefaultValueAttribute(typeof(int), "1"), System.ComponentModel.CategoryAttribute("自定义cx"), System.ComponentModel.DescriptionAttribute("边框大小")]
            public int BorderWidth
            {
                get
                {
                    return this._BorderWidth;
                }
                set
                {
                    this._BorderWidth = value;
                    if (this.DesignMode == true)
                    {
                        this.Invalidate();
                    }
                }
            }
    
            [System.ComponentModel.DefaultValueAttribute(typeof(int), "0"), System.ComponentModel.CategoryAttribute("自定义cx"), System.ComponentModel.DescriptionAttribute("圆角大小")]
            public int Curvature
            {
                get
                {
                    return this._Curvature;
                }
                set
                {
                    this._Curvature = value;
                    if (this.DesignMode == true)
                    {
                        this.Invalidate();
                    }
                }
            }
    
            [System.ComponentModel.DefaultValueAttribute(typeof(CornerCurveMode), "All"), System.ComponentModel.CategoryAttribute("自定义cx"), System.ComponentModel.DescriptionAttribute("圆角的位置")]
            public CornerCurveMode CurveMode
            {
                get
                {
                    return this._CurveMode;
                }
                set
                {
                    this._CurveMode = value;
                    if (this.DesignMode == true)
                    {
                        this.Invalidate();
                    }
                }
            }
    
            private int adjustedCurve
            {
                get
                {
                    int curve = 0;
                    if (!(this._CurveMode == CornerCurveMode.None))
                    {
                        if (this._Curvature > (this.ClientRectangle.Width / 2))
                        {
                            curve = DoubleToInt(this.ClientRectangle.Width / 2);
                        }
                        else
                        {
                            curve = this._Curvature;
                        }
                        if (curve > (this.ClientRectangle.Height / 2))
                        {
                            curve = DoubleToInt(this.ClientRectangle.Height / 2);
                        }
                    }
                    return curve;
                }
            }
    
            public RoundPanel()
                : base()
            {
                this.SetDefaultControlStyles();
                this.customInitialisation();
            }
    
            private void SetDefaultControlStyles()
            {
                this.SetStyle(System.Windows.Forms.ControlStyles.DoubleBuffer, true);
                this.SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, false);
                this.SetStyle(System.Windows.Forms.ControlStyles.ResizeRedraw, true);
                this.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, true);
                this.SetStyle(System.Windows.Forms.ControlStyles.SupportsTransparentBackColor, true);
            }
    
            private void customInitialisation()
            {
                this.SuspendLayout();
                base.BackColor = System.Drawing.Color.Transparent;
                this.BorderStyle = System.Windows.Forms.BorderStyle.None;
                this.ResumeLayout(false);
            }
    
            protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs pevent)
            {
                base.OnPaintBackground(pevent);
                pevent.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                System.Drawing.Drawing2D.GraphicsPath graphPath;
                graphPath = this.GetPath();
                //    Create Gradient Brush (Cannot be width or height 0)
                System.Drawing.Drawing2D.LinearGradientBrush filler;
                System.Drawing.Rectangle rect = this.ClientRectangle;
                if (this.ClientRectangle.Width == 0)
                {
                    rect.Width += 1;
                }
                if (this.ClientRectangle.Height == 0)
                {
                    rect.Height += 1;
                }
                if (this._GradientMode == LinearGradientMode.None)
                {
                    filler = new System.Drawing.Drawing2D.LinearGradientBrush(rect, this._BackColour1, this._BackColour1, System.Drawing.Drawing2D.LinearGradientMode.Vertical);
                }
                else
                {
                    filler = new System.Drawing.Drawing2D.LinearGradientBrush(rect, this._BackColour1, this._BackColour2, ((System.Drawing.Drawing2D.LinearGradientMode)this._GradientMode));
                }
                pevent.Graphics.FillPath(filler, graphPath);
                filler.Dispose();
                if (this._BorderStyle == System.Windows.Forms.BorderStyle.FixedSingle)
                {
                    System.Drawing.Pen borderPen = new System.Drawing.Pen(this._BorderColour, this._BorderWidth);
                    pevent.Graphics.DrawPath(borderPen, graphPath);
                    borderPen.Dispose();
                }
                else if (this._BorderStyle == System.Windows.Forms.BorderStyle.Fixed3D)
                {
                    DrawBorder3D(pevent.Graphics, this.ClientRectangle);
                }
                else if (this._BorderStyle == System.Windows.Forms.BorderStyle.None)
                {
                }
                filler.Dispose();
                graphPath.Dispose();
            }
    
            protected System.Drawing.Drawing2D.GraphicsPath GetPath()
            {
                System.Drawing.Drawing2D.GraphicsPath graphPath = new System.Drawing.Drawing2D.GraphicsPath();
                if (this._BorderStyle == System.Windows.Forms.BorderStyle.Fixed3D)
                {
                    graphPath.AddRectangle(this.ClientRectangle);
                }
                else
                {
                    try
                    {
                        int curve = 0;
                        System.Drawing.Rectangle rect = this.ClientRectangle;
                        int offset = 0;
                        if (this._BorderStyle == System.Windows.Forms.BorderStyle.FixedSingle)
                        {
                            if (this._BorderWidth > 1)
                            {
                                offset = DoubleToInt(this.BorderWidth / 2);
                            }
                            curve = this.adjustedCurve;
                        }
                        else if (this._BorderStyle == System.Windows.Forms.BorderStyle.Fixed3D)
                        {
                        }
                        else if (this._BorderStyle == System.Windows.Forms.BorderStyle.None)
                        {
                            curve = this.adjustedCurve;
                        }
                        if (curve == 0)
                        {
                            graphPath.AddRectangle(System.Drawing.Rectangle.Inflate(rect, -offset, -offset));
                        }
                        else
                        {
                            int rectWidth = rect.Width - 1 - offset;
                            int rectHeight = rect.Height - 1 - offset;
                            int curveWidth = 1;
                            if ((this._CurveMode & CornerCurveMode.TopRight) != 0)
                            {
                                curveWidth = (curve * 2);
                            }
                            else
                            {
                                curveWidth = 1;
                            }
                            graphPath.AddArc(rectWidth - curveWidth, offset, curveWidth, curveWidth, 270, 90);
                            if ((this._CurveMode & CornerCurveMode.BottomRight) != 0)
                            {
                                curveWidth = (curve * 2);
                            }
                            else
                            {
                                curveWidth = 1;
                            }
                            graphPath.AddArc(rectWidth - curveWidth, rectHeight - curveWidth, curveWidth, curveWidth, 0, 90);
                            if ((this._CurveMode & CornerCurveMode.BottomLeft) != 0)
                            {
                                curveWidth = (curve * 2);
                            }
                            else
                            {
                                curveWidth = 1;
                            }
                            graphPath.AddArc(offset, rectHeight - curveWidth, curveWidth, curveWidth, 90, 90);
                            if ((this._CurveMode & CornerCurveMode.TopLeft) != 0)
                            {
                                curveWidth = (curve * 2);
                            }
                            else
                            {
                                curveWidth = 1;
                            }
                            graphPath.AddArc(offset, offset, curveWidth, curveWidth, 180, 90);
                            graphPath.CloseFigure();
                        }
                    }
                    catch (System.Exception)
                    {
                        graphPath.AddRectangle(this.ClientRectangle);
                    }
                }
                return graphPath;
            }
    
            public static void DrawBorder3D(System.Drawing.Graphics graphics, System.Drawing.Rectangle rectangle)
            {
                graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
                graphics.DrawLine(System.Drawing.SystemPens.ControlDark, rectangle.X, rectangle.Y, rectangle.Width - 1, rectangle.Y);
                graphics.DrawLine(System.Drawing.SystemPens.ControlDark, rectangle.X, rectangle.Y, rectangle.X, rectangle.Height - 1);
                graphics.DrawLine(System.Drawing.SystemPens.ControlDarkDark, rectangle.X + 1, rectangle.Y + 1, rectangle.Width - 1, rectangle.Y + 1);
                graphics.DrawLine(System.Drawing.SystemPens.ControlDarkDark, rectangle.X + 1, rectangle.Y + 1, rectangle.X + 1, rectangle.Height - 1);
                graphics.DrawLine(System.Drawing.SystemPens.ControlLight, rectangle.X + 1, rectangle.Height - 2, rectangle.Width - 2, rectangle.Height - 2);
                graphics.DrawLine(System.Drawing.SystemPens.ControlLight, rectangle.Width - 2, rectangle.Y + 1, rectangle.Width - 2, rectangle.Height - 2);
                graphics.DrawLine(System.Drawing.SystemPens.ControlLightLight, rectangle.X, rectangle.Height - 1, rectangle.Width - 1, rectangle.Height - 1);
                graphics.DrawLine(System.Drawing.SystemPens.ControlLightLight, rectangle.Width - 1, rectangle.Y, rectangle.Width - 1, rectangle.Height - 1);
            }
    
            public static int DoubleToInt(double value)
            {
                return System.Decimal.ToInt32(System.Decimal.Floor(System.Decimal.Parse((value).ToString())));
            }
    
    
    
        }
    }
  • 相关阅读:
    杭电 1548 A strange lift(广搜)
    JAVA数组的定义及用法
    WPF之Binding深入探讨
    FBReaderJ源代码编译配置
    【剑指offer】合并两有序单链表
    对HGE游戏引擎的一次封装
    WAV文件格式分析
    Ubuntu9.04更新源
    内核及内核模块
    java实现第七届蓝桥杯愤怒小鸟
  • 原文地址:https://www.cnblogs.com/chengulv/p/4146844.html
Copyright © 2020-2023  润新知