Winform Tab增加关闭标签页

Winform的Tab控件,有新增有移除,但是呢,缺了一个标签页上的关闭按钮,这个东西说重要也重要,说不重要也不重要。


这里就说一下怎么添加这玩意。


这玩意需要重绘tab控件,所以我们需要处理DrawItem事件,在DrawItem里面把这个X画出来。这里我们就用英文字母的x来当作关闭按钮,也不加什么鼠标事件之类的,就简简单单的实现一下。


首先我们要重写DrawItem事件,在事件里面

        private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
        {
            //这里我们添加一个新的Padding,来增加x的距离
            tabControl1.Padding = new System.Drawing.Point(21, 3);

            //这里我们用DrawString来画一个x字符
            e.Graphics.DrawString("x", e.Font, Brushes.Black, e.Bounds.Right - 15, e.Bounds.Top + 4);
            e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + 12, e.Bounds.Top + 4);
            e.DrawFocusRectangle();
        }

我们来简单解释一下这玩意,首先我们用DrawString来画一个x,这个位置我也是抄的,算是一个比较好看的位置。


然后我们再把原来的标题画上去。就是下面的那句DrawString

最后一句我们画出活动区域来。

这样我们的tab的标签页上就有这个x字符了。

这里有可能会报一个GDI+的错误,我没有搞定,但是这个错误完全不影响后面的处理,所以我就直接try了,目前看没什么影响。

有了这个x,我们还要点击它就关闭标签页,所以我们要重写tab的MouseDownMouseUpMouseClick事件之一。

我们这里使用MouseDown事件。因为这个事件目前看用起来最顺手。

for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
            {
                Rectangle r = tabControl1.GetTabRect(i);
                // 获取x所在的位置
                Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7);
                if (closeButton.Contains(e.Location))
                {
                    if (MessageBox.Show("确定关闭这个标签页吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        this.tabControl1.TabPages.RemoveAt(i);
                        break;
                    }
                }
            }

每次在Tab上执行MouseDown的时候,我们都要判断其是否点击的是我们的x的位置,由于我们有好多个标签页,所以我们要循环去处理所有的标签页。

首先我们通过Rectangle r = tabControl1.GetTabRect(i);获取到标签页的区域,然后使用Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7);获取到x的位置,这里的r.Right - 15, r.Top + 4是我们画x的时候指定的,9, 7是大概的x的大小,这里如果我们希望可以点击的区域大一点,就调整这几个值即可。


最后我们判断一下如果我们鼠标点击的区域在这个区域内,证明我们点击了x了,需要关闭这个tab页,然后就走正常的关闭逻辑即可。

posted @ 2022-07-18 17:39  jvx  阅读(1874)  评论(0编辑  收藏  举报