欢迎莅临 SUN WU GANG 的园子!!!

世上无难事,只畏有心人。有心之人,即立志之坚午也,志坚则不畏事之不成。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

实例一:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace KUN.CONTROL.LIB.CONTROL
{
    public partial class KMenuTabControl : System.Windows.Forms.TabControl
    {
        #region 属性、构造
        Color SelectedColor = Color.LightSkyBlue;
        Color MoveColor = Color.LightSeaGreen;
        Color FontColor = Color.Black;
        int TextLeft = 10;
        [Browsable(true)]
        [Description("选项卡标题左边距"), Category("TextLeft"), DefaultValue(typeof(Int32), "10")]
        public int TitleTextLeft
        {
            get { return TextLeft; }
            set { this.TextLeft = value; }
        }

        [Browsable(true)]
        [Description("选项卡标题字体颜色"), Category("TitleColor"), DefaultValue(typeof(Color), "Black")]
        public Color TitleFontColor
        {
            get { return FontColor; }
            set { this.FontColor = value; }
        }

        [Browsable(true)]
        [Description("选项卡标题字体选中颜色"), Category("TitleColor"), DefaultValue(typeof(Color), "LightSkyBlue")]
        public Color TitleSelectedColor
        {
            get { return SelectedColor; }
            set { this.SelectedColor = value; }
        }

        [Browsable(true)]
        [Description("选项卡标题字体悬浮颜色"), Category("TitleColor"), DefaultValue(typeof(Color), "White")]
        public Color TitleMoveColor
        {
            get { return MoveColor; }
            set { this.MoveColor = value; }
        }

        [Browsable(true), Description("整个控件的背景色"), Category("外观")]
        public Color TabControlBackColor { get; set; }

        [Browsable(true), Description("TabControl ItemSize"), Category("外观")]
        public Size TabControlItemSize { get; set; }

        public KMenuTabControl()
        {
            this.SuspendLayout();
            this.DrawMode = TabDrawMode.OwnerDrawFixed;
            this.ResumeLayout(false);
            this.SizeMode = TabSizeMode.Fixed;
            this.Multiline = true;
            this.TabControlBackColor = Color.SeaShell;
            this.TabControlItemSize = new Size(100, 28);
            this.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tabMenu_DrawItem);
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MainTabControl_MouseDown);
        }
        #endregion

        protected override void OnPaint(PaintEventArgs e)
        {
            Rectangle tcRec = this.ClientRectangle;//整个tabControl的边框
            e.Graphics.FillRectangle(new SolidBrush(this.TabControlBackColor), tcRec);
            if (this.ItemSize!=this.TabControlItemSize)
            {
                this.ItemSize = TabControlItemSize;
            }

            StringFormat sf = new StringFormat();//封装文本布局信息 
            sf.LineAlignment = StringAlignment.Center;
            sf.Alignment = StringAlignment.Near;
            for (int i = 0; i < this.TabCount; i++)
            {
                Graphics g = e.Graphics;
                // int width = (int)g.MeasureString(this.Controls[i].Text, this.Font).Width + 40;
                Rectangle rect = this.GetTabRect(i);
                //  rect.Width = width;
                if (this.SelectedIndex == i)
                    g.FillRectangle(new SolidBrush(MoveColor), rect);
                else g.FillRectangle(new SolidBrush(SelectedColor), rect);

                SolidBrush brush = new SolidBrush(FontColor);
                //  rect.Width = width;
                rect.X += TextLeft;
                g.DrawString(this.Controls[i].Text, this.Font, brush, rect, sf);
                using (Pen objpen = new Pen(Color.Black))
                {
                    int tx = (int)(rect.X + (rect.Width - 30));
                    rect.X = tx - 2;
                    Point p5 = new Point(tx, 8);
                    Font font = new System.Drawing.Font("微软雅黑", 12);
                    g.DrawString("〇", font, brush, rect, sf);
                    font = new System.Drawing.Font("微软雅黑", 11);
                    rect.X = tx + 2;
                    rect.Y = rect.Y - 1;
                    g.DrawString("×", font, brush, rect, sf);
                }
            }
        }

        public override Rectangle DisplayRectangle
        {
            get
            {
                Rectangle rect = base.DisplayRectangle;
                return new Rectangle(rect.Left - 2, rect.Top - 2, rect.Width + 4, rect.Height + 5);
            }
        }

        int index = -1;
        protected override void OnMouseMove(MouseEventArgs e)
        {
            int Count = 0;
            try
            {
                Graphics g = this.CreateGraphics();
                SolidBrush brush = new SolidBrush(FontColor);
                StringFormat sf = new StringFormat();//封装文本布局信息 
                sf.LineAlignment = StringAlignment.Center;
                sf.Alignment = StringAlignment.Near;

                for (int i = 0; i < this.TabPages.Count; i++)
                {
                    TabPage tp = this.TabPages[i];
                    if (this.GetTabRect(i).Contains(e.Location) && tp != this.SelectedTab)
                    {
                        if (index != i)
                        {
                            if (Count == 0)
                            {
                                if (index != -1 && this.TabPages[index] != this.SelectedTab)
                                {
                                    g.FillRectangle(new SolidBrush(SelectedColor), this.GetTabRect(index));

                                    RectangleF tRectangle = this.GetTabRect(index);
                                    tRectangle.X += TextLeft;
                                    g.DrawString(this.Controls[index].Text, this.Font, brush, tRectangle, sf);
                                }
                                Count = 1;
                            }
                            index = i;
                            g.FillRectangle(new SolidBrush(SelectedColor), this.GetTabRect(i));
                            RectangleF tRectangleF = this.GetTabRect(i);
                            tRectangleF.X += TextLeft;
                            g.DrawString(this.Controls[i].Text, this.Font, brush, tRectangleF, sf);
                            using (Pen objpen = new Pen(Color.Black))
                            {
                                int tx = (int)(tRectangleF.X + (tRectangleF.Width - 30));
                                tRectangleF.X = tx - 2;
                                brush.Color = Color.White;
                                Font font = new System.Drawing.Font("微软雅黑", 12);
                                g.DrawString("〇", font, brush, tRectangleF, sf);
                                font = new System.Drawing.Font("微软雅黑", 11);
                                tRectangleF.X = tx + 2;
                                tRectangleF.Y = tRectangleF.Y - 1;
                                g.DrawString("×", font, brush, tRectangleF, sf);
                            }
                        }
                    }
                    if (this.GetTabRect(i).Contains(e.Location) && tp == this.SelectedTab)
                    {
                        if (index != -1 && index != this.SelectedIndex)
                        {
                            g.FillRectangle(new SolidBrush(SelectedColor), this.GetTabRect(index));
                            RectangleF tRectangleF = this.GetTabRect(index);
                            tRectangleF.X += TextLeft;
                            g.DrawString(this.Controls[index].Text, this.Font, brush, tRectangleF, sf);
                            using (Pen objpen = new Pen(Color.Black))
                            {
                                int tx = (int)(tRectangleF.X + (tRectangleF.Width - 30));
                                tRectangleF.X = tx - 2;
                                Font font = new System.Drawing.Font("微软雅黑", 12);
                                g.DrawString("〇", font, brush, tRectangleF, sf);
                                font = new System.Drawing.Font("微软雅黑", 11);
                                tRectangleF.X = tx + 2;
                                tRectangleF.Y = tRectangleF.Y - 1;
                                g.DrawString("×", font, brush, tRectangleF, sf);
                            }
                        }
                        index = -1;
                    }
                }
            }
            catch (Exception)
            {
            }
            Count = 0;
            base.OnMouseMove(e);
        }

        protected override void OnMouseLeave(EventArgs e)
        {
            try
            {
                Graphics g = this.CreateGraphics();
                if (index != -1 && this.TabPages[index] != this.SelectedTab)
                {
                    g.FillRectangle(new SolidBrush(SelectedColor), this.GetTabRect(index));
                    SolidBrush brush = new SolidBrush(FontColor);
                    RectangleF tRectangleF = this.GetTabRect(index);
                    StringFormat sf = new StringFormat();//封装文本布局信息 
                    sf.LineAlignment = StringAlignment.Center;
                    sf.Alignment = StringAlignment.Near;
                    tRectangleF.X += TextLeft;
                    g.DrawString(this.Controls[index].Text, this.Font, brush, tRectangleF, sf);
                    using (Pen objpen = new Pen(Color.Black))
                    {
                        int tx = (int)(tRectangleF.X + (tRectangleF.Width - 30));
                        tRectangleF.X = tx - 2;
                        Point p5 = new Point(tx, 8);
                        Font font = new System.Drawing.Font("微软雅黑", 12);
                        g.DrawString("〇", font, brush, tRectangleF, sf);
                        font = new System.Drawing.Font("微软雅黑", 11);
                        tRectangleF.X = tx + 2;
                        tRectangleF.Y = tRectangleF.Y - 1;
                        g.DrawString("×", font, brush, tRectangleF, sf);
                    }
                }
            }
            catch (Exception)
            {
            }
            index = -1;
            base.OnMouseLeave(e);
        }
        /// <summary>
        /// 重绘控件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tabMenu_DrawItem(object sender, DrawItemEventArgs e)
        {
            this.SetStyle(
            ControlStyles.UserPaint |                      // 控件将自行绘制,而不是通过操作系统来绘制  
            ControlStyles.OptimizedDoubleBuffer |          // 该控件首先在缓冲区中绘制,而不是直接绘制到屏幕上,这样可以减少闪烁  
            ControlStyles.AllPaintingInWmPaint |           // 控件将忽略 WM_ERASEBKGND 窗口消息以减少闪烁  
            ControlStyles.ResizeRedraw |                   // 在调整控件大小时重绘控件  
            ControlStyles.SupportsTransparentBackColor,    // 控件接受 alpha 组件小于 255 的 BackColor 以模拟透明  
            true);                                         // 设置以上值为 true  
            this.UpdateStyles();
        }

        //关闭按钮功能
        private void MainTabControl_MouseDown(object sender, MouseEventArgs e)
        {
            int closeSize = 20;
            if (e.Button == MouseButtons.Left)
            {
                int x = e.X, y = e.Y;
                //计算关闭区域   
                Rectangle tab = this.GetTabRect(this.SelectedIndex);
                tab.Offset(tab.Width - (closeSize + 3), 4);
                tab.Width = closeSize;
                tab.Height = closeSize;

                if (this.TabCount == 1) return;

                //如果鼠标在区域内就关闭选项卡   
                bool isClose = x > tab.X && x < tab.Right && y > tab.Y && y < tab.Bottom;
                if (isClose == true)
                {
                    this.TabPages.Remove(this.SelectedTab);
                }
            }
        }

    }
}

实例二:

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace KUN.CONTROL.LIB.CONTROL
{
    public partial class KTabControl : System.Windows.Forms.TabControl
    {
        [Browsable(true), Description("整个控件的背景色"), Category("外观")]
        public Color TabControlBackColor { get; set; }

        [Browsable(true), Description("Tab的标题栏边框颜色"), Category("外观")]
        public Color TabBorderColor { get; set; }

        [Browsable(true), Description("当前激活Tab的标题栏背景色"), Category("外观")]
        public Color ActivedTabBackColor { get; set; }

        [Browsable(true), Description("当前激活Tab的标题文字颜色"), Category("外观")]
        public Color ActivedTabLabelColor { get; set; }

        [Browsable(true), Description("未激活Tab的标题栏背景色"), Category("外观")]
        public Color InActivedTabBackColor { get; set; }

        [Browsable(true), Description("未激活Tab的标题文字颜色"), Category("外观")]
        public Color InActivedTabLabelColor { get; set; }

        [Browsable(true), Description("Tab标题栏的大小"), Category("外观")]
        public Size TabSize { get; set; }

        public KTabControl()
        {
            this.InitializeComponent();

            TabSet();

            this.TabBorderColor = Color.Black;
            this.ActivedTabLabelColor = Color.Black;
            this.InActivedTabLabelColor = Color.Black;
            this.ActivedTabBackColor = Color.White;
            this.InActivedTabBackColor = Color.FromArgb(0, 192, 192);
            this.TabControlBackColor = Color.Transparent;
            this.TabSize = new Size(100, 35);
        }

        protected override void OnMouseDoubleClick(MouseEventArgs e)
        {
            if (this.TabPages.Count == 1) return;
            this.TabPages.RemoveAt(this.SelectedIndex);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            Rectangle tcRec = this.ClientRectangle;//整个tabControl的边框
            e.Graphics.FillRectangle(new SolidBrush(this.TabControlBackColor), tcRec);

            for (int i = 0; i < this.TabPages.Count; i++)
            {
                Rectangle tabRectangle = new Rectangle(1, 1 + i * TabSize.Height, TabSize.Width, TabSize.Height);
                SolidBrush brush = new SolidBrush(this.InActivedTabLabelColor);
                StringFormat sf = new StringFormat();//封装文本布局信息
                sf.LineAlignment = StringAlignment.Center;
                sf.Alignment = StringAlignment.Center;
                if (i == this.SelectedIndex)
                {
                    brush = new SolidBrush(this.ActivedTabLabelColor);
                    e.Graphics.FillRectangle(new SolidBrush(ActivedTabBackColor), tabRectangle);
                    e.Graphics.DrawRectangle(new Pen(this.TabBorderColor), tabRectangle);
                }
                else
                {
                    e.Graphics.FillRectangle(new SolidBrush(InActivedTabBackColor), tabRectangle);
                    e.Graphics.DrawRectangle(new Pen(this.TabBorderColor), tabRectangle);
                }
                e.Graphics.DrawString(this.Controls[i].Text, this.Font, brush, tabRectangle, sf);
            }
        }

        /// <summary>
        /// 设定控件绘制模式
        /// </summary>
        private void TabSet()
        {
            this.DrawMode = TabDrawMode.OwnerDrawFixed;
            this.Alignment = TabAlignment.Left;
            this.SizeMode = TabSizeMode.Fixed;
            this.Multiline = true;
            base.SetStyle(
                ControlStyles.UserPaint |                      
                ControlStyles.OptimizedDoubleBuffer |           
                ControlStyles.AllPaintingInWmPaint |             
                ControlStyles.ResizeRedraw |                     
                ControlStyles.SupportsTransparentBackColor,      
                true);                                         
            base.UpdateStyles();
        }

        public override Rectangle DisplayRectangle
        {
            get
            {
                Rectangle rect = base.DisplayRectangle;
                return new Rectangle(rect.Left - 3, rect.Top - 3, rect.Width + 6, rect.Height + 5);
            }
        }
    }
}

  

posted on 2019-09-09 15:07  sunwugang  阅读(5974)  评论(0编辑  收藏  举报