zoukankan      html  css  js  c++  java
  • 给TabControl中的每个tabpage标题上加X,并且设置tabControl上部除标题外的背景颜色

    最近做项目遇到了一个不小的麻烦,上网找了半天没有找到相关有用资料,索性自己去实现,以解决自己现在遇到的麻烦。同时,

    也能够帮助一下与我有相同问题的人。

    麻烦:
    1、给tabpage加上 关闭按钮X

    2、当设置tabControl的DrawMode 为OwnerDrawFixed时如

    myTabControl.DrawMode = TabDrawMode.OwnerDrawFixed;

    会发现tabControl不会继承它parent的backcolor,而是VS提供的默认颜色,而我现在的项目考虑到VS默认的颜色影响美观,

    所以,希望能够自己设置它的颜色。

    解决方案:

    使用GDI进行自己绘制。在tabpage的标题上绘制关闭按钮X,绘制tabControl中除了标题部分的backcolor。

    1、绘制关闭按钮:

    在tabControl的DrawItem事件中添加如下代码:

    try
    {

    Rectangle myTabRect = this.myTabControl.GetTabRect(e.Index);

    //先添加TabPage属性
    e.Graphics.DrawString(this.myTabControl.TabPages[e.Index].Text
    , this.Font, SystemBrushes.ControlText, myTabRect.X + 2, myTabRect.Y + 2);

    //再画一个矩形框
    using (Pen p = new Pen(Color.Black))//自动释放资源
    {
    myTabRect.Offset(myTabRect.Width - (CLOSE_SIZE + 3), 2);
    myTabRect.Width = CLOSE_SIZE;
    myTabRect.Height = CLOSE_SIZE;
    e.Graphics.DrawRectangle(p, myTabRect);
    }

    //画关闭符号
    using (Pen objpen = new Pen(Color.Black))
    {
    //"/"线
    Point p1 = new Point(myTabRect.X + 3, myTabRect.Y + 3);
    Point p2 = new Point(myTabRect.X + myTabRect.Width - 3, myTabRect.Y + myTabRect.Height - 3);
    e.Graphics.DrawLine(objpen, p1, p2);

    //"/"线
    Point p3 = new Point(myTabRect.X + 3, myTabRect.Y + myTabRect.Height - 3);
    Point p4 = new Point(myTabRect.X + myTabRect.Width - 3, myTabRect.Y + 3);
    e.Graphics.DrawLine(objpen, p3, p4);
    }

    e.Graphics.Dispose();
    }
    catch (Exception)
    {

    }

    然后在myTabControl的MouseDown事件中进行填充关闭功能。

    代码如下:

    if (e.Button == MouseButtons.Left)
    {
    int x = e.X, y = e.Y;

    int CLOSE_SIZE=10;

    //计算关闭区域
    Rectangle myTabRect = this.myTabControl.GetTabRect(this.myTabControl.SelectedIndex);

    myTabRect.Offset(myTabRect.Width - (CLOSE_SIZE + 3), 2);
    myTabRect.Width = CLOSE_SIZE;
    myTabRect.Height = CLOSE_SIZE;

    //如果鼠标在区域内就关闭选项卡
    bool isClose = x > myTabRect.X && x < myTabRect.Right
    && y > myTabRect.Y && y < myTabRect.Bottom;

    if (isClose == true)
    {
    this.myTabControl.TabPages.Remove(this.myTabControl.SelectedTab);
    }
    }

    2、填充tabControl的上部除了TabPage标题的backcolor

    还是在tabControl的DrawItem事件中添加如下代码:

    Graphics g = e.Graphics;
    Rectangle endPageRect = myTabControl.GetTabRect(myTabControl.TabPages.Count - 1); //最后一个标题栏的范围
    Rectangle TitleRect = myTabControl.GetTabRect(e.Index); //当前标题栏的范围
    Rectangle HeaderBackRect = Rectangle.Empty;

    HeaderBackRect = new Rectangle(new Point(endPageRect.X + endPageRect.Width, endPageRect.Y),
    new Size(myTabControl.Width - endPageRect.X - endPageRect.Width, endPageRect.Height));
    Brush b = new SolidBrush(Color.Azure);
    g.FillRectangle(b, HeaderBackRect);

    来自 http://blog.csdn.net/my_2008wing/article/details/5507162

  • 相关阅读:
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    72. Edit Distance
    583. Delete Operation for Two Strings
    582. Kill Process
    indexDB基本用法
    浏览器的渲染原理
    js实现txt/excel文件下载
    git 常用命令
    nginx进入 配置目录时
  • 原文地址:https://www.cnblogs.com/sung/p/2826726.html
Copyright © 2011-2022 走看看