扩展GroupBox控件

1、GroupBox的边框颜色可以自行设置;

2、GroupBox可以设置边框的为圆角;

3、设置GroupBox标题在控件中的位置。

4、设置GroupBox标题的字体和颜色。

具体实现步骤Panel扩展一样,直接看具体的代码,代码如下:

public class GroupBoxEx : GroupBox
    {
        private Font _titleFont = new Font("宋体", 10, FontStyle.Regular);
        private Color _titleColor = Color.Green;
        private Color _borderColor = Color.FromArgb(23, 169, 254);
        private int _radius = 10;
        private int _tiltePos =10;   

        private const int WM_ERASEBKGND = 0x0014;
        private const int WM_PAINT = 0xF;   

        public GroupBoxEx()
            : base()
        {
        }   

        [DefaultValue(typeof(Color), "23, 169, 254"), Description("控件边框颜色")]
        public Color BorderColor
        {
            get { return _borderColor; }
            set
            {
                _borderColor = value;
                base.Invalidate();
            }
        }   

        [DefaultValue(typeof(Color), "Green"), Description("标题颜色")]
        public Color TitleColor
        {
            get { return _titleColor; }
            set
            {
                _titleColor = value;
                base.Invalidate();
            }
        }   

        [DefaultValue(typeof(Font), ""), Description("标题字体设置")]
        public Font TitleFont
        {
            get { return _titleFont; }
            set
            {
                _titleFont = value;
                base.Invalidate();
            }
        }   

        [DefaultValue(typeof(int), "30"), Description("圆角弧度大小")]
        public int Radius
        {
            get { return _radius; }
            set
            {
                _radius = value;
                base.Invalidate();
            }
        }   

        [DefaultValue(typeof(int), "10"), Description("标题位置")]
        public int TiltePos
        {
            get { return _tiltePos; }
            set
            {
                _tiltePos = value;
                base.Invalidate();
            }
        }   

        protected override void WndProc(ref Message m)
        {
            try
            {
                base.WndProc(ref m);
                if (m.Msg == WM_PAINT)
                {
                    if (this.Radius > 0)
                    {
                        using (Graphics g = Graphics.FromHwnd(this.Handle))
                        {
                            Rectangle r = new Rectangle();
                            r.Width = this.Width;
                            r.Height = this.Height;
                            DrawBorder(g, r, this.Radius);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }   

        private void DrawBorder(Graphics g, Rectangle rect, int radius)
        {
            rect.Width -= 1;
            rect.Height -= 1;   

            using (Pen pen = new Pen(this.BorderColor))
            {
                g.Clear(this.BackColor);
                g.DrawString(this.Text, this.TitleFont, new SolidBrush(this.TitleColor), radius + this.TiltePos, 0);   

                g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;   

                GraphicsPath path = new GraphicsPath();   

                float height = g.MeasureString(this.Text, this.TitleFont).Height / 2;
                float width = g.MeasureString(this.Text, this.TitleFont).Width;   

                path.AddArc(rect.X, rect.Y + height, radius, radius, 180, 90);//左上角弧线
                  path.AddLine(radius, rect.Y + height, radius + this.TiltePos, rect.Y + height);   

                path.StartFigure();   

                path.AddLine(radius + this.TiltePos + width, rect.Y + height, rect.Right - radius, rect.Y + height);   

                path.AddArc(rect.Right - radius, rect.Y + height, radius, radius, 270, 90);//右上角弧线
                  path.AddArc(rect.Right - radius, rect.Bottom - radius, radius, radius, 0, 90);
                path.AddArc(rect.X, rect.Bottom - radius, radius, radius, 90, 90);   

                path.StartFigure();   

                path.AddArc(rect.X, rect.Y + height, radius, radius, -90, -90);//左上角弧线
                  path.AddArc(rect.X, rect.Bottom - radius, radius, radius, -180, -90);   

                g.DrawPath(pen, path);
            }
        }
    }  

1、在扩展GroupBox控件中,为了实现上述需求,扩展了5个自定义属性,编码完成,编译之后,控件的属性多了以下项,如图所示:

2、控件运行之后效果,如下:

PS:

1、如何给自定义控件属性设置默认值和功能提示?

在属性之前,添加此行代码:[DefaultValue(typeof(Color), "23, 169, 254"),Description("控件边框颜色")]

DefaultValue 属于System.ComponentModel.DefaultValueAttribute类中,设置属性的初始值。

Description 用于描述属性。

设置属性是否在控件属性框中显示,可在属性前加[Browsable(false)],这样就能隐藏属性在属性栏中的显示。

2、GraphicsPath类介绍

GraphicsPath类提供了一系列的绘制图形的方法,比如AddArc、AddLine等等,可以绘制各种曲线 。可以通过使用 CloseFigure() 方法显式闭合一个图形,通过StartFigure()方法创建一个新的图像。

(1)、GraphicsPath 对象存储一系列直线和贝塞尔样条。可以将多种类型的曲线(椭圆、弧形和基数样条)添加到路径,但在存储到路径之前,各种曲线都被转换为贝塞尔样条。

(2)、应用程序使用路径来绘制形状的轮廓、填充形状内部和创建剪辑区域。

(3)、路径可由任意数目的图形(子路径)组成。每一图形都是由一系列相互连接的直线和曲线或几何形状基元构成的。图形的起始点是相互连接的一系列直线和曲线中的第一点。终结点是该序列中的最后一点。

(4)、图形具有方向,方向描述在起始点和终结点之间绘制直线段和曲线段的方式。方向按将直线和曲线添加到图形的顺序定义,或者按几何形状基元定义。方向用来确定剪辑和填充的路径内部。

原文地址:http://www.itbobo.com/winfrom-groupbox.html

原文地址:https://www.cnblogs.com/belx/p/9190360.html

时间: 2024-08-02 20:00:48

扩展GroupBox控件的相关文章

Duilib实现GroupBox控件

转载:http://blog.csdn.net/asd313346541/article/details/47055113 原作者的源码上说:右边线和下边线显示不出来: 后来经过调试研究测试猜测应该是没有给控件设置borderround属性,后来设置后出来效果: 最后放上源码(稍微做了修改): .h文件 1 #ifndef _UIGROUPBOX_H_ 2 #define _UIGROUPBOX_H_ 3 4 #define GROUPBOX_TEXT_OFFSET 40 //定义GroupBo

扩展GridView控件——为内容项添加拖放及分组功能

引言 相信大家对GridView都不陌生,是非常有用的控件,用于平铺有序的显示多个内容项.打开任何WinRT应用或者是微软合作商的网站,都会在APP中发现GridView的使用."Tiles"提供了一个简单易用,平铺方式来组织内容显示.Windows8的开始菜单是最典型的GridView 示例."开始菜单"显示了系统中安装的所有应用程序,而且支持重新排列. 本文源于我们项目的开发人员,他们想在项目中提供与GridView相同的用户体验,想要创建类GridView控件

winform groupbox控件放到窗体中间位置

1. 在Form中放一个控件,让其在启动时始终居中 int gLeft = this.Width / 2 - groupControl1.Width / 2; int gTop = this.Height / 2 - groupControl1.Height / 2; groupControl1.Location = new Point(gLeft, gTop);. 2.在设计界面时,先把groupbox控件放到窗体中间位置,然后anchor属性 设置为none 即可

[Silverlight] 仿Excel扩展C1FlexGrid控件

一  分析阶段 根据Excel表格区域的划分,如下图,基本上以4行*3列的框架搭建: 第一行为列头区域     ==>  C1FlexGrid.ColumnHeaders 第二行为单元格区域  ==>  C1FlexGrid.Cells 第三行为列尾区域     ==>  C1FlexGrid.ColumnFooters 第四行为横向滚动条区域,在Excel里还有工作簿页签等: 第一列为行头区域     ==>  C1FlexGrid.RowHeaders 第二列为单元格区域 第三

MVC中使用HTML Helper类扩展HTML控件

文章摘自:http://www.cnblogs.com/zhangziqiu/archive/2009/03/18/1415005.html MVC在view页面,经常需要用到很多封装好的HTML控件,这篇文章主要讲述,怎么自己扩展和定制自己需要的控件. ---------------------------------------------------------- HTML Helper类是ASP.NET MVC框架中提供的生成HTML控件代码的类. 本质上与第一种方式一样, 只是我们可以

扩展SplitContainer控件

效果图: 自定义控件实现代码: 1 using System; 2 using System.ComponentModel; 3 using System.Drawing; 4 using System.Windows.Forms; 5 6 namespace WindowsFormsApplication1 7 { 8 [ToolboxBitmap(typeof(SplitContainer))] 9 public partial class SplitContainerEx : SplitC

Winform - 判断GroupBox控件中的TextBox文本框是不是为空

foreach (Control item in this.groupBox2.Controls) { if (item is TextBox) { if (item.Text.Trim() == "") { MessageBox.Show("文本框不能为空!", "提示"); return; } } }

WinForms中TreeView控件的扩展与使用

EXE文件方便大家测试   源码下载 TreeView控件非常的好用,在我的公文系统中,使用TreeView控件选择接收公文的人员,支持单选,可多选 现提取出来,方便大家使用 涉及到的知识点 1:从Xml文件中加载内容显示到TreeView控件中 <?xml version="1.0" encoding="utf-8"?> <根目录> <组 名称="校长" 用户ID="1000"> <

C#控件方法及属性大全,望补充

C#控件及常用设计整理 1.窗体 常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体. (2) WindowState属性: 用来获取或设置窗体的窗口状态. 取值有三种: Normal (窗体正常显示). Minimized (窗体以最小化形式显示)和 Maximized(窗体以最大化形式显示). (3)StartPosition属性:用来获取或设置运行时窗体的起始位置. (4)Text属性:该属性是一个字符串属性,用来设置或返回在窗口标题栏中显示的