winform==>GroupBox 自定义控件

来源:互联网 发布:java json 清空 编辑:程序博客网 时间:2024/05/21 07:03
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace WindowsApplication1
{
    public partial class GroupBox : UserControl
    {
        public GroupBox()
        {
            InitializeComponent();
            InitializeStyles();
            InitializeGroupBox();
        }
        /// <summary>This method will initialize the controls custom styles.</summary>
        private void InitializeStyles()
        {
            //Set the control styles----------------------------------
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            //--------------------------------------------------------
        }


        /// <summary>This method will initialize the GroupBox control.</summary>
        private void InitializeGroupBox()
        {
            components = new System.ComponentModel.Container();
            this.Resize += new EventHandler(GroupBox_Resize);
            this.DockPadding.All = 20;
            this.Name = "GroupBox";
            this.Size = new System.Drawing.Size(368, 288);
        }
         protected override void OnPaint(PaintEventArgs e)
        {
            //PaintBack(e.Graphics);
            Test(e.Graphics);
    
        }
        public void Test(Graphics g)
        {
            g.SmoothingMode = SmoothingMode.AntiAlias;
            int ArcX2 = (this.ShadowControl) ? (this.Width - (15)) - this.ShadowThickness : this.Width - (15);

            int ArcY2 = (this.ShadowControl) ? (this.Height - (15)) - this.ShadowThickness : this.Height - (15);

            System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
            System.Drawing.Brush BorderBrush = new SolidBrush(Color.FromArgb(224, 224, 224));
            System.Drawing.Pen BorderPen = new Pen(BorderBrush, 1);
           // System.Drawing.Drawing2D.LinearGradientBrush BackgroundGradientBrush = null;
           // System.Drawing.Brush BackgroundBrush = new SolidBrush(this.BackgroundColor);
           // System.Drawing.SolidBrush ShadowBrush = null;
           // System.Drawing.Drawing2D.GraphicsPath ShadowPath = null;
   
            //Create Rounded Rectangle Path------
            path.AddArc(0, 10, 14, 14, 180, GroupBoxConstants.SweepAngle); // Top Left
            path.AddArc(ArcX2, 10, 14, 14, 270, GroupBoxConstants.SweepAngle); //Top Right
            path.AddArc(ArcX2, ArcY2, 14, 14, 360, GroupBoxConstants.SweepAngle); //Bottom Right
            path.AddArc(0, ArcY2, 14, 14, 90, GroupBoxConstants.SweepAngle); //Bottom Left
            path.CloseAllFigures();
            //-----------------------------------

            ////Check if Gradient Mode is enabled--
            //if (this.BackgroundGradientMode == GroupBoxGradientMode.None)
            //{
            //    //Paint Rounded Rectangle------------
            //    g.FillPath(BackgroundBrush, path);
            //    //-----------------------------------
            //}
            //else
            //{
            //    BackgroundGradientBrush = new LinearGradientBrush(new Rectangle(0, 0, this.Width, this.Height), this.BackgroundColor, this.BackgroundGradientColor, (LinearGradientMode)this.BackgroundGradientMode);

            //    //Paint Rounded Rectangle------------
            //    g.FillPath(BackgroundGradientBrush, path);
            //    //-----------------------------------
            //}
            ////-----------------------------------

            //Paint Borded-----------------------
            g.DrawPath(BorderPen, path);
            //-----------------------------------
 

        }
        private int V_RoundCorners = 10;
        /// <summary>This feature will round the corners of the control.</summary>
        [Category("Appearance"), Description("This feature will round the corners of the control.")]
        public int RoundCorners
        {
            get { return V_RoundCorners; }
            set
            {
                if (value > 25)
                {
                    V_RoundCorners = 25;
                }
                else
                {
                    if (value < 1) { V_RoundCorners = 1; }
                    else { V_RoundCorners = value; }
                }

                this.Refresh();
            }
        }
        /// <summary>This feature will allow you to turn on control shadowing.</summary>
        [Category("Appearance"), Description("This feature will allow you to turn on control shadowing.")]
        public bool ShadowControl { get { return V_ShadowControl; } set { V_ShadowControl = value; this.Refresh(); } }
        private bool V_ShadowControl = false;
        /// <summary>This feature will change the size of the shadow border.</summary>
        [Category("Appearance"), Description("This feature will change the size of the shadow border.")]
        public int ShadowThickness
        {
            get { return V_ShadowThickness; }
            set
            {
                if (value > 10)
                {
                    V_ShadowThickness = 10;
                }
                else
                {
                    if (value < 1) { V_ShadowThickness = 1; }
                    else { V_ShadowThickness = value; }
                }

                this.Refresh();
            }
        }
        private int V_ShadowThickness = 3;
        private System.Drawing.Color V_BorderColor = Color.Black;
        /// <summary>This feature will change the group control color. This color can also be used in combination with BackgroundGradientColor for a gradient paint.</summary>
        [Category("Appearance"), Description("This feature will change the group control color. This color can also be used in combination with BackgroundGradientColor for a gradient paint.")]
        public System.Drawing.Color BackgroundColor { get { return V_BackgroundColor; } set { V_BackgroundColor = value; this.Refresh(); } }
        private System.Drawing.Color V_BackgroundColor = Color.White;

        /// <summary>This class holds all GroupBox constants.</summary>
        public class GroupBoxConstants
        {
            #region Constants

            /// <summary>The sweep angle of the arc.</summary>
            public const int SweepAngle = 90;

            /// <summary>The minimum control height.</summary>
            public const int MinControlHeight = 32;

            /// <summary>The minimum control width.</summary>
            public const int MinControlWidth = 96;

            #endregion
        }
        /// <summary>This feature turns on background gradient painting.</summary>
        [Category("Appearance"), Description("This feature turns on background gradient painting.")]
        public GroupBoxGradientMode BackgroundGradientMode { get { return V_BackgroundGradientMode; } set { V_BackgroundGradientMode = value; this.Refresh(); } }
        private GroupBoxGradientMode V_BackgroundGradientMode = GroupBoxGradientMode.None;
        /// <summary>A special gradient enumeration.</summary>
        public enum GroupBoxGradientMode
        {
            /// <summary>Specifies no gradient mode.</summary>
            None = 4,

            /// <summary>Specifies a gradient from upper right to lower left.</summary>
            BackwardDiagonal = 3,

            /// <summary>Specifies a gradient from upper left to lower right.</summary>
            ForwardDiagonal = 2,

            /// <summary>Specifies a gradient from left to right.</summary>
            Horizontal = 0,

            /// <summary>Specifies a gradient from top to bottom.</summary>
            Vertical = 1
        }
        /// <summary>This feature will allow you to change the color of the control's border.</summary>
        [Category("Appearance"), Description("This feature will allow you to change the color of the control's border.")]
        public System.Drawing.Color BorderColor { get { return V_BorderColor; } set { V_BorderColor = value; this.Refresh(); } }

        /// <summary>This feature will allow you to set the control's border size.</summary>
        [Category("Appearance"), Description("This feature will allow you to set the control's border size.")]
        public float BorderThickness
        {
            get { return V_BorderThickness; }
            set
            {
                if (value > 3)
                {
                    V_BorderThickness = 3;
                }
                else
                {
                    if (value < 1) { V_BorderThickness = 1; }
                    else { V_BorderThickness = value; }
                }
                this.Refresh();
            }
        }
        private float V_BorderThickness = 1;

        /// <summary>This feature will change the control's shadow color.</summary>
        [Category("Appearance"), Description("This feature will change the control's shadow color.")]
        public System.Drawing.Color ShadowColor { get { return V_ShadowColor; } set { V_ShadowColor = value; this.Refresh(); } }
        private System.Drawing.Color V_ShadowColor = Color.DarkGray;
        /// <summary>This feature can be used in combination with BackgroundColor to create a gradient background.</summary>
        [Category("Appearance"), Description("This feature can be used in combination with BackgroundColor to create a gradient background.")]
        public System.Drawing.Color BackgroundGradientColor { get { return V_BackgroundGradientColor; } set { V_BackgroundGradientColor = value; this.Refresh(); } }
        private System.Drawing.Color V_BackgroundGradientColor = Color.White;

        /// <summary>This method will paint the control.</summary>
        /// <param name="g">The paint event graphics object.</param>
        private void PaintBack(System.Drawing.Graphics g)
        {
            //Set Graphics smoothing mode to Anit-Alias--
            g.SmoothingMode = SmoothingMode.AntiAlias;
            //-------------------------------------------

            //Declare Variables------------------
            int ArcWidth = this.RoundCorners * 2;
            int ArcHeight = this.RoundCorners * 2;
            int ArcX1 = 0;
            int ArcX2 = (this.ShadowControl) ? (this.Width - (ArcWidth + 1)) - this.ShadowThickness : this.Width - (ArcWidth + 1);
            int ArcY1 = 10;
            int ArcY2 = (this.ShadowControl) ? (this.Height - (ArcHeight + 1)) - this.ShadowThickness : this.Height - (ArcHeight + 1);
            System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
            System.Drawing.Brush BorderBrush = new SolidBrush(this.BorderColor);
            System.Drawing.Pen BorderPen = new Pen(BorderBrush, this.BorderThickness);
            System.Drawing.Drawing2D.LinearGradientBrush BackgroundGradientBrush = null;
            System.Drawing.Brush BackgroundBrush = new SolidBrush(this.BackgroundColor);
            System.Drawing.SolidBrush ShadowBrush = null;
            System.Drawing.Drawing2D.GraphicsPath ShadowPath = null;
            //-----------------------------------

            //Check if shadow is needed----------
            if (this.ShadowControl)
            {
                ShadowBrush = new SolidBrush(this.ShadowColor);
                ShadowPath = new System.Drawing.Drawing2D.GraphicsPath();
                ShadowPath.AddArc(ArcX1 + this.ShadowThickness, ArcY1 + this.ShadowThickness, ArcWidth, ArcHeight, 180, GroupBoxConstants.SweepAngle); // Top Left
                ShadowPath.AddArc(ArcX2 + this.ShadowThickness, ArcY1 + this.ShadowThickness, ArcWidth, ArcHeight, 270, GroupBoxConstants.SweepAngle); //Top Right
                ShadowPath.AddArc(ArcX2 + this.ShadowThickness, ArcY2 + this.ShadowThickness, ArcWidth, ArcHeight, 360, GroupBoxConstants.SweepAngle); //Bottom Right
                ShadowPath.AddArc(ArcX1 + this.ShadowThickness, ArcY2 + this.ShadowThickness, ArcWidth, ArcHeight, 90, GroupBoxConstants.SweepAngle); //Bottom Left
                ShadowPath.CloseAllFigures();

                //Paint Rounded Rectangle------------
                g.FillPath(ShadowBrush, ShadowPath);
                //-----------------------------------
            }
            //-----------------------------------

            //Create Rounded Rectangle Path------
            path.AddArc(ArcX1, ArcY1, ArcWidth, ArcHeight, 180, GroupBoxConstants.SweepAngle); // Top Left
            path.AddArc(ArcX2, ArcY1, ArcWidth, ArcHeight, 270, GroupBoxConstants.SweepAngle); //Top Right
            path.AddArc(ArcX2, ArcY2, ArcWidth, ArcHeight, 360, GroupBoxConstants.SweepAngle); //Bottom Right
            path.AddArc(ArcX1, ArcY2, ArcWidth, ArcHeight, 90, GroupBoxConstants.SweepAngle); //Bottom Left
            path.CloseAllFigures();
            //-----------------------------------

            //Check if Gradient Mode is enabled--
            if (this.BackgroundGradientMode == GroupBoxGradientMode.None)
            {
                //Paint Rounded Rectangle------------
                g.FillPath(BackgroundBrush, path);
                //-----------------------------------
            }
            else
            {
                BackgroundGradientBrush = new LinearGradientBrush(new Rectangle(0, 0, this.Width, this.Height), this.BackgroundColor, this.BackgroundGradientColor, (LinearGradientMode)this.BackgroundGradientMode);

                //Paint Rounded Rectangle------------
                g.FillPath(BackgroundGradientBrush, path);
                //-----------------------------------
            }
            //-----------------------------------

            //Paint Borded-----------------------
            g.DrawPath(BorderPen, path);
            //-----------------------------------

            //Destroy Graphic Objects------------
            if (path != null) { path.Dispose(); }
            if (BorderBrush != null) { BorderBrush.Dispose(); }
            if (BorderPen != null) { BorderPen.Dispose(); }
            if (BackgroundGradientBrush != null) { BackgroundGradientBrush.Dispose(); }
            if (BackgroundBrush != null) { BackgroundBrush.Dispose(); }
            if (ShadowBrush != null) { ShadowBrush.Dispose(); }
            if (ShadowPath != null) { ShadowPath.Dispose(); }
            //-----------------------------------
        }

        private void GroupBox_Resize(object sender, EventArgs e)
        {
            this.Invalidate(false);
        }
 
    }
}

编译后在工具箱生成控件直接拖到窗体上使用就行。

忘了修改哪里的代码了。应该是codeproject上面的、

另外一种:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace WindowsApplication1
{
    public partial class UserControl2 : UserControl
    {
     
        public UserControl2()
        {
            InitializeComponent();
            InitializeStyles();
           
        }
        /// <summary>This method will initialize the controls custom styles.</summary>
        private void InitializeStyles()
        {
            //Set the control styles----------------------------------
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            //--------------------------------------------------------
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            //PaintBack(e.Graphics);
            Test(e.Graphics);

        }
        public void Test(Graphics g)
        {
            g.SmoothingMode = SmoothingMode.AntiAlias;
        
            System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
            System.Drawing.Brush BorderBrush = new SolidBrush(Color.FromArgb(224, 224, 224));
            System.Drawing.Pen BorderPen = new Pen(BorderBrush, 1);

            //Create Rounded Rectangle Path------
            path.AddArc(0, 10, 14, 14, 180, 90); // Top Left
            path.AddArc(this.Width - (15), 10, 14, 14, 270, 90); //Top Right
            path.AddArc(this.Width - (15), this.Height - (15), 14, 14, 360, 90); //Bottom Right
            path.AddArc(0, this.Height - (15), 14, 14, 90, 90); //Bottom Left
            path.CloseAllFigures();
            //-----------------------------------
            //Paint Borded-----------------------
            g.DrawPath(BorderPen, path);
            //-----------------------------------
            //Destroy Graphic Objects------------
            if (path != null) { path.Dispose(); }
            if (BorderBrush != null) { BorderBrush.Dispose(); }
            if (BorderPen != null) { BorderPen.Dispose(); }
             //-----------------------------------

        }
      
   
        private void UserControl2_Resize(object sender, EventArgs e)
        {
            this.Invalidate(false);
        }

    }
}


原创粉丝点击