2014-10-11 108 views
0

我正在制作一个需要添加或删除选项卡(选项卡控制)的应用程序。我已经完成添加和删除标签,但我有自定义按钮,而不是使用标签。 (点击时,此按钮会去的第一个标签页):如何添加和删除C#中的“自定义”选项卡

//This will make it go to TAB 1 
    private void button1_Click(object sender, EventArgs e) 
    { 
     tabControl1.SelectedIndex = 0; 
    } 

    //This will change the MOUSEENTER to the correct image 
    private void button1_MouseEnter(object sender, EventArgs e) 
    { 
     button1.MouseEnter += new EventHandler(button1_MouseEnter); 
     this.button1.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.Tab_Down)); 
    } 
    //This will change the MOUSELEAVE to the correct image 
    private void button1_MouseLeave(object sender, EventArgs e) 
    { 
     button1.MouseLeave += new EventHandler(button1_MouseLeave); 
     this.button1.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.Tab_Norm)); 
    } 

不过,我将如何创建它,所以当你点击“添加标签”按钮,它会创建一个新的标签,但它也创造了一个新的按钮其中例如有tabControl1.SelectedIndex = 1;

编辑

我已经这样做了添加一个新的标签(tabControl1):

private void button2_Click(object sender, EventArgs e) 
    { 
     string title = "TabPage " + (tabControl1.TabCount + 1).ToString(); 
     TabPage myTabPage = new TabPage(title); 
     tabControl1.TabPages.Add(myTabPage); 
    } 

这增加了精细的现有顶部的新标签。但我该怎么做,这样它也创建了一个新的按钮,上面的按钮的属性,但它使得它,而不是tabControl1.SelectedIndex = 1;它确实tabControl1.SelectedIndex = 3;,每次我添加一个新标签时上升? - 谢谢

回答

3

这几个更新后,这是我的答案的新版本。它表明你如何

  • 添加Button增加了一个新的TabPages而选择其
  • 充分利用Tab控制绘制关闭“X”字符每个标签的右侧,如Firefox或Visual Studio这样做。

添加Button就像你想要的,也许文本=“+”和高度像标签的高度。它自动定位在选项卡上。如果您的Tab被移动或调整大小,您可能需要重新定位它。

在事件Tab设置为OwnerDrawFixed和每个网页上的文本是由几个空格追加以腾出空间给关闭X。该代码创建一个类变量closeX来保存当前的x-rectangle并在MouseClick事件中对其进行测试。

确保连接tabControl1_DrawItemtabControl1_MouseClick事件!

private void cb_addPage_Click(object sender, EventArgs e) 
    { 
     string title = "TabPage " + (tabControl1.TabCount + 1).ToString() + " "; 
     TabPage myTabPage = new TabPage(title); 
     tabControl1.TabPages.Add(myTabPage); 
     tabControl1.SelectedTab = myTabPage; 
    } 


    private void Form1_Load(object sender, EventArgs e) 
    { 
     tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; 
     cb_addPage.Top = tabControl1.Top; 
     cb_addPage.Left = tabControl1.Right - cb_addPage.Width; 
     foreach (TabPage tp in tabControl1.TabPages) tp.Text += " "; 
    } 


    Rectangle closeX = Rectangle.Empty; 

    private void tabControl1_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     Size xSize = new Size(13,13); 
     TabPage tp = tabControl3.TabPages[e.Index]; 
     e.DrawBackground(); 
     using (SolidBrush brush = new SolidBrush(e.ForeColor) ) 
       e.Graphics.DrawString(tp.Text+ " ", e.Font, brush, 
            e.Bounds.X + 3, e.Bounds.Y + 4); 

     if (e.State == DrawItemState.Selected) 
     { 
      closeX = new Rectangle(
       e.Bounds.Right - xSize.Width, e.Bounds.Top, xSize.Width, xSize.Height); 
      using (SolidBrush brush = new SolidBrush(Color.LightGray)) 
       e.Graphics.DrawString("x", e.Font, brush, 
             e.Bounds.Right - xSize.Width, e.Bounds.Y + 4); 
     } 

    } 

    private void tabControl1_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (closeX.Contains(e.Location)) 
      tabControl1.TabPages.Remove(tabControl1.SelectedTab); 
    } 

如果你想使用图片来装饰标签,包括与您的形式一个ImageList,与图像(S)加载它,如果关闭按钮是第一形象,改变这样的代码:

if (e.State == DrawItemState.Selected) 
    { 
     closeX = new Rectangle(e.Bounds.Right - xSize.Width - 3, 
           e.Bounds.Top + 5, xSize.Width, xSize.Height); 
     e.Graphics.DrawImage(imageList1.Images[0], closeX, 
          new Rectangle(0,0,16,16), GraphicsUnit.Pixel); 
    } 

我追加标签的截图有几页

owner drawn tab with closing button

而一个使用此enter image description here关闭按钮图像:

enter image description here

更新:请注意,如果您TabPage包含IDisposable对象,你应该确保他们都让你删除的页面之前处置!示例代码见here

+0

对啊,我很高兴我能够做到这一点。非常感谢,我知道我问了很多,但我想我可以改变按钮和旁边的X的图片? - 谢谢 – Bittenfleax 2014-10-11 18:09:22

+0

在代码中,它们都是文本。是的,你可以改变它,但它需要了解Graphics.DrawImage(而不是DrawString)的细节来将'x'更改为图像。但是:看看VS和FF!他们看起来就像它。有一段时间,使用红色X的图像被使用,但今天事情变得更加缓和。 – TaW 2014-10-11 18:15:24

+0

非常感谢您的帮助。它现在工作正常,但是如果你正在做它,我怎么能创建一个新的标签,其上的内容,例如,每个创建的标签在同一个地方有一个按钮,它是同一个按钮。有没有办法复制它?谢谢 – Bittenfleax 2014-10-11 22:05:38

相关问题