C# TabControl重写

看到有很多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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过继承TabControl重写CreateParams属性来实现自定义关闭按钮。具体步骤如下: 1. 创建一个新类,继承自TabControl。 2. 重写CreateParams属性,添加TCS_BUTTONS风格和TCS_OWNERDRAWFIXED风格。 3. 重写WndProc方法,处理WM_PAINT和WM_LBUTTONUP消息,绘制关闭按钮并处理点击事件。 以下是示例代码: ``` public class CloseableTabControl : TabControl { private const int TCM_FIRST = 0x1300; private const int TCM_SETMINTABWIDTH = TCM_FIRST + 49; private const int TCS_BUTTONS = 0x100; private const int TCS_OWNERDRAWFIXED = 0x200; private const int CLOSE_SIZE = 16; private const int CLOSE_OFFSET = 5; private Image closeImage = Properties.Resources.Close; protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.Style |= TCS_BUTTONS | TCS_OWNERDRAWFIXED; return cp; } } protected override void WndProc(ref Message m) { if (m.Msg == 0x000F) // WM_PAINT { for (int i = 0; i < this.TabCount; i++) { Rectangle rect = this.GetTabRect(i); rect.Offset(rect.Width - CLOSE_SIZE - CLOSE_OFFSET, CLOSE_OFFSET); if (this.SelectedTab == this.TabPages[i]) { ControlPaint.DrawImage(Graphics.FromHwnd(this.Handle), closeImage, rect, new Rectangle(0, 0, closeImage.Width, closeImage.Height), Color.Transparent); } else { ControlPaint.DrawImageDisabled(Graphics.FromHwnd(this.Handle), closeImage, rect.Left, rect.Top, Color.Transparent); } } } else if (m.Msg == 0x0201) // WM_LBUTTONDOWN { Point pos = new Point(m.LParam.ToInt32()); for (int i = 0; i < this.TabCount; i++) { Rectangle rect = this.GetTabRect(i); rect.Offset(rect.Width - CLOSE_SIZE - CLOSE_OFFSET, CLOSE_OFFSET); if (rect.Contains(pos)) { this.TabPages.RemoveAt(i); break; } } } else { base.WndProc(ref m); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值