C# TabControl重写

来源:互联网 发布:ajax怎么解析json数据 编辑:程序博客网 时间:2024/06/05 08:52
看到有很多TabControl类似的控件,界面友好,具有更多的其他功能,比如关闭,所以进行自己上网搜了一下,然后自己进行实践,有了如下内容。如有错误之处,请指正。1.Graphics不懂,看Graphics类详解2.首先了解TabControl这个控件。

属性:
1.Alignment
获取或设置选项卡在其中对齐的控件区域(例如,顶部边缘)。
即选项卡的显示位置。
2.Appearance
获取或设置控件选项卡的可视外观。
即选项卡的样式,TabApperance->Menu;
3.HotTrack
获取或设置一个值,该值指示在鼠标移到控件的选项卡时,这些选项卡是否更改外观。
4.ImageList
获取或设置在控件的选项卡上显示的图像。
5.ItemSize
获取或设置控件的选项卡的大小。
6.RightToLeftLayout
获取或设置一个值,该值指示是否可以显示一行以上的选项卡。
7.RowCount
获取控件的选项卡条中当前正显示的行数。
8.SelectedIndex
获取或设置当前选定的选项卡页的索引
9.SelectedTab
获取或设置当前选定的选项卡页。
10.ShowToolTips
获取或设置一个值,该值指示当鼠标移到选项卡上时是否显示该选项卡的“工具提示”。
11.SizeMode
获取或设置调整控件的选项卡大小的方式。
12.TabCount
获取选项卡条中选项卡的数目。
13.TabPages
获取该选项卡控件中选项卡页的集合。
14.Padding
获取或设置控件的选项卡页上每个项周围的空间量。

函数:
1.DeselectTab
overload
使具有指定索引的选项卡后面的选项卡成为当前选项卡。
2.GetControl
获取指定位置的 System.Windows.Forms.TabPage 控件。
3.GetItems
获取一个由属于 System.Windows.Forms.TabControl 控件的 System.Windows.Forms.TabPage 控件构成的数组。
4.GetTabRect
返回该选项卡控件中的指定选项卡的边框。
5.GetToolTipText
获取指定的 System.Windows.Forms.TabPage 的工具提示。
6.RemoveAll
从该选项卡控件中移除所有的选项卡页和附加的控件
7.SelectTab
overload
使具有指定索引的选项卡成为当前选项卡。

事件:
1.DrawItem
如果 System.Windows.Forms.TabControl.DrawMode 属性设置为 System.Windows.Forms.TabDrawMode.OwnerDrawFixed,则当System.Windows.Forms.TabControl 需要绘制它的每一个选项卡时发生。
2.Deselected
如果 System.Windows.Forms.TabControl.DrawMode 属性设置为 System.Windows.Forms.TabDrawMode.OwnerDrawFixed,则当 System.Windows.Forms.TabControl 需要绘制它的每一个选项卡时发生。
3.SelectedIndexChanged
在 System.Windows.Forms.TabControl.SelectedIndex 属性更改后发生。
4.Selected
当选择某个选项卡时发生。

重写代码:

        // 构造函数        public TabControlExtern()            : base()        {            base.DrawMode = TabDrawMode.OwnerDrawFixed;            //增加DrawItem事件            this.DrawItem += OverridOnDrawItem;            //增加MouseDown事件            this.MouseDown += OverridMouseDown;            InitializeComponent();        }        // 用于实际设置的TabControlMode        private TabControlMode _tabControlMode;        // 存储控件设置的Padding值        private Point _padding;        // 获取或设置绘制控件的选项卡的方式。        [Browsable(true)]        [DefaultValue(TabDrawMode.OwnerDrawFixed)]        [ReadOnly(true)]        public new TabDrawMode DrawMode        {            get            {                return base.DrawMode;            }        }        // 选项卡显示的图片        [Browsable(true)]        public Image TabImage { get; set; }        // TabControl显示方式        [Browsable(true)]        [DefaultValue(TabControlMode.Close)]        public TabControlMode StyleMode { get {            if (_tabControlMode == TabControlMode.Image && this.TabImage == null)                _tabControlMode = TabControlMode.Close;            return _tabControlMode;        }            set {                 _tabControlMode=value;                if (_tabControlMode == TabControlMode.Image && this.TabImage == null)                    _tabControlMode = TabControlMode.Close;              }        }         // 重写父类Padding        public new Point Padding        {            get {                switch (this.StyleMode)                {                    case TabControlMode.Normal:                    case TabControlMode.Close:                    case TabControlMode.Image:                        _padding = new Point(base.Padding.X - 4, base.Padding.Y);                        break;                    case TabControlMode.All:                        _padding = new Point((base.Padding.X - 4)/2, base.Padding.Y);                        break;                }                return _padding;            }            set {                _padding = value;                switch (this.StyleMode)                {                    case TabControlMode.Normal:                    case TabControlMode.Close:                    case TabControlMode.Image:                        base.Padding = new Point(_padding.X + 4, _padding.Y);                        break;                    case TabControlMode.All:                        base.Padding = new Point(_padding.X * 2 + 4, _padding.Y);                        break;                }            }        }        // 被选中的选择项的背景色        [Browsable(true)]        public Color BackGroundColor { get; set; }        //MosuDown事件,关闭选项卡,此处有点复杂化,使用变量可以在DrawItem中对被选中的TabPage进行赋值操作。        private void OverridMouseDown(object sender, MouseEventArgs e)        {            if (this.StyleMode ==TabControlMode.Image || e.Button != MouseButtons.Left )                return;            Rectangle selectedRec = this.GetTabRect(this.SelectedIndex);            int width, yValue;            double dValue;            width = base.Padding.X * 2 > selectedRec.Height ? selectedRec.Height - 4 : base.Padding.X * 2 - 4;            dValue = (selectedRec.Height - width) / 2;            yValue = Convert.ToInt32(Math.Round(dValue));              switch (this.StyleMode)            {                case TabControlMode.Normal:                case TabControlMode.Close:                    selectedRec.X = selectedRec.X + selectedRec.Width - width - 2;                    selectedRec.Y = selectedRec.Y - yValue;                    selectedRec.Width = selectedRec.Height = width;                    break;                case TabControlMode.Image:                    break;                case TabControlMode.All:                    width = selectedRec.Height = base.Padding.X > selectedRec.Height ? selectedRec.Height - 2 : base.Padding.X - 2;                    selectedRec.X = selectedRec.X + selectedRec.Width - width - 2;                    selectedRec.Y = selectedRec.Y + yValue;                    break;            }            if (e.X >= selectedRec.X && e.X <= selectedRec.X + width && e.Y >= selectedRec.Y && e.Y <= selectedRec.Y + width)                this.TabPages.RemoveAt(this.SelectedIndex);        }        private void OverridOnDrawItem(object sender, DrawItemEventArgs e)        {            //获取当前选项卡            Rectangle rec = this.GetTabRect(e.Index);            //创建新的Rectangle            Rectangle newRec = new Rectangle();            int newRecWidth,yValue;            //计算关闭按钮大小            newRecWidth = base.Padding.X * 2 > rec.Height ? rec.Height - 4 : base.Padding.X * 2 - 4;            //计算垂直坐标            double dValue = (rec.Height - newRecWidth) / 2;            yValue = Convert.ToInt32(Math.Round(dValue));              if (e.Index == this.SelectedIndex)            {                //进行填充背景色                e.Graphics.FillRectangle(new SolidBrush(BackGroundColor), rec);            }            switch (this.StyleMode)            {                case TabControlMode.Normal:                case TabControlMode.Close:                    #region Normal,Close                    //绘制文字                    e.Graphics.DrawString(this.TabPages[e.Index].Text, this.Font, new SolidBrush(this.TabPages[e.Index].ForeColor), rec.X - 1, rec.Y + base.Padding.Y);                    //计算close的Rectangle                    newRec.Width = newRec.Height = newRecWidth;                    newRec.X = rec.X + rec.Width - newRec.Width - 2;                    newRec.Y = rec.Y + yValue;                    //绘制关闭按钮方框                    e.Graphics.DrawRectangle(Pens.Black, newRec);                    //绘制关闭按钮颜色,Color.FromArgb10进制的8 位颜色值                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(191, 83, 62)), new Rectangle(newRec.X + 1, newRec.Y + 1, newRec.Width - 1, newRec.Height - 1));                    //绘制关闭的X                    e.Graphics.DrawLine(new Pen(Color.White) { Width = 2 }, newRec.X + 4, newRec.Y + 4, newRec.X + newRec.Width - 4, newRec.Y + newRec.Height - 4);                    e.Graphics.DrawLine(new Pen(Color.White) { Width = 2 }, newRec.X + 4, newRec.Y + newRec.Height - 4, newRec.X + newRec.Width - 4, newRec.Y + 4);                    break;                #endregion                case TabControlMode.Image:                    #region Image                    //计算image的Rectangle                    newRec.Width = newRec.Height = newRecWidth;                    newRec.X = rec.X + 1;                    newRec.Y = rec.Y + yValue;                    //绘制图片                    e.Graphics.DrawImage(this.TabImage, newRec);                    //绘制文字                    e.Graphics.DrawString(this.TabPages[e.Index].Text, this.Font, new SolidBrush(this.TabPages[e.Index].ForeColor), newRec.X + newRec.Width + 1, rec.Y + base.Padding.Y);                    break;                    #endregion                case TabControlMode.All:                    #region All                    //计算image的Rectangle                    newRec.Width = newRec.Height = base.Padding.X > rec.Height ? rec.Height - 2 : base.Padding.X  - 2;                    newRec.X = rec.X + 1;                    newRec.Y = rec.Y + yValue;                    //绘制图片                    e.Graphics.DrawImage(this.TabImage, newRec);                    //绘制文字                    e.Graphics.DrawString(this.TabPages[e.Index].Text, this.Font, new SolidBrush(this.TabPages[e.Index].ForeColor), newRec.X + newRec.Width + 1, rec.Y + base.Padding.Y);                    //计算close的Rectangle                    newRec.X = rec.X + rec.Width - newRec.Width - 2;                    //绘制关闭按钮颜色,Color.FromArgb10进制的8 位颜色值                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(191, 83, 62)),newRec);                    //绘制关闭的X                    e.Graphics.DrawLine(new Pen(Color.White) { Width = 2 }, newRec.X + 4, newRec.Y + 4, newRec.X + newRec.Width - 4, newRec.Y + newRec.Height - 4);                    e.Graphics.DrawLine(new Pen(Color.White) { Width = 2 }, newRec.X + 4, newRec.Y + newRec.Height - 4, newRec.X + newRec.Width - 4, newRec.Y + 4);                    break;                    #endregion            }        }    /// <summary>    /// TabControl显示方式    /// </summary>    public enum TabControlMode    {        /// <summary>        /// 效果与TabControl一致        /// </summary>        Normal = 0,        /// <summary>        /// 具有关闭功能        /// </summary>        Close = 1,        /// <summary>        /// 具有图片功能        /// </summary>        Image = 2,        /// <summary>        /// 同时具有关闭和图片功能        /// </summary>        All = 3    }
最终效果:(http://img.blog.csdn.net/20170729212025658?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ194dWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
原创粉丝点击