zoukankan      html  css  js  c++  java
  • [转]C#重绘TabControl的Tabpage标签,添加图片及关闭按钮

    以下就是C#重绘TabControl控件的源码:效果如同所示:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1.june
    {
        public partial class TabTest : Form
        {
            public TabTest()
            {
                InitializeComponent();
            }
     
            private void TabTest_Load(object sender, EventArgs e)
            {
                //清空控件
                //this.MainTabControl.TabPages.Clear();
                //绘制的方式OwnerDrawFixed表示由窗体绘制大小也一样
                this.MainTabControl.DrawMode = TabDrawMode.OwnerDrawFixed;
                this.MainTabControl.Padding = new System.Drawing.Point(CLOSE_SIZE, CLOSE_SIZE);
                this.MainTabControl.DrawItem += new DrawItemEventHandler(this.MainTabControl_DrawItem);
                this.MainTabControl.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MainTabControl_MouseDown);
            }
     
            const int CLOSE_SIZE = 15;
            //tabPage标签图片
            Bitmap image = new Bitmap("E:\ico_close.gif");
     
            //绘制“X”号即关闭按钮
            private void MainTabControl_DrawItem(object sender, DrawItemEventArgs e)
            {
                try
                {
                    Rectangle myTabRect = this.MainTabControl.GetTabRect(e.Index);
     
                    //先添加TabPage属性  
                    e.Graphics.DrawString(this.MainTabControl.TabPages[e.Index].Text, this.Font, SystemBrushes.ControlText, myTabRect.X + 2, myTabRect.Y + 2);
     
                    //再画一个矩形框
                    using (Pen p = new Pen(Color.White))
                    {
                        myTabRect.Offset(myTabRect.Width - (CLOSE_SIZE + 3), 2);
                        myTabRect.Width = CLOSE_SIZE;
                        myTabRect.Height = CLOSE_SIZE;
                        e.Graphics.DrawRectangle(p, myTabRect);
                    }
     
                    //填充矩形框
                    Color recColor = e.State == DrawItemState.Selected ? Color.White : Color.White;
                    using (Brush b = new SolidBrush(recColor))
                    {
                        e.Graphics.FillRectangle(b, myTabRect);
                    }
     
                    //画关闭符号
                    using (Pen objpen = new Pen(Color.Black))
                    {
                        ////=============================================
                        //自己画X
                        ////""线
                        //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);
     
                        ////=============================================
                        //使用图片
                        Bitmap bt = new Bitmap(image);
                        Point p5 = new Point(myTabRect.X, 4);
                        e.Graphics.DrawImage(bt, p5);
                        //e.Graphics.DrawString(this.MainTabControl.TabPages[e.Index].Text, this.Font, objpen.Brush, p5);
                    }
                    e.Graphics.Dispose();
                }
                catch (Exception)
                { }
            }
     
            //关闭按钮功能
            private void MainTabControl_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    int x = e.X, y = e.Y;
                    //计算关闭区域  
                    Rectangle myTabRect = this.MainTabControl.GetTabRect(this.MainTabControl.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.MainTabControl.TabPages.Remove(this.MainTabControl.SelectedTab);
                    }
                }
            }
        }
    }

    可以加一个imageList,然后设置tabControl的imageList属性,再设置各个tab的ImageIndex或ImageKey属性,即可,只不过这样图标会在文本的左侧。如同所示:

  • 相关阅读:
    android29
    android28
    android27
    android26
    Dynamics CRM2011 MspInstallAction failed when installing an Update Rollup
    Dynamics CRM Import Solution Attribute Display Name description is null or empty
    The service cannot be activated because it does not support ASP.NET compatibility
    IIS部署WCF报 无法读取配置节“protocolMapping”,因为它缺少节声明
    Unable to access the IIS metabase.You do not have sufficient privilege
    LM算法与非线性最小二乘问题
  • 原文地址:https://www.cnblogs.com/zhangxin4477/p/6804021.html
Copyright © 2011-2022 走看看