В качестве опции вы можете добавить дополнительную вкладку, которая показывает значок добавления , и проверить, когда пользователь нажимает эту вкладку, а затем вставить новый TabPage
перед этим.
Также вы можете предотвратить выбор этой дополнительной вкладки простым использованием Selecting
события TabControl
. Таким образом, последняя вкладка действует только как кнопка добавления для вас, например IE и Chrome.
Подробности реализации
Мы будем использовать владельца сделать вкладку, чтобы показать близкие значки на каждой вкладке значок добавления на последней вкладке.Мы используем DrawItem
, чтобы нарисовать близко и добавить значки, MouseDown
, чтобы обработать щелчок по закрытию и добавить кнопки, Selecting
, чтобы предотвратить выбор последней вкладки и HandleCreated
для настройки ширины вкладки. Вы можете увидеть все параметры и коды реализации ниже.
Initialization
Набор набивка и DrawMode
и назначать обработчики событий DrawItem
, MouseDown
, Selecting
и HandleCreated
события.
this.tabControl1.Padding = new Point(12, 4);
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += tabControl1_DrawItem;
this.tabControl1.MouseDown += tabControl1_MouseDown;
this.tabControl1.Selecting += tabControl1_Selecting;
this.tabControl1.HandleCreated += tabControl1_HandleCreated;
Ручка нажмите на кнопке закрытия и добавить кнопку
Вы можете обрабатывать MouseDown
или MouseClick
события и проверить, если последняя вкладку прямоугольник содержит указатель мыши, а затем вставить вкладку перед последней вкладкой. Otherwose проверка если один из близких кнопок содержит щелкнул местоположение, а затем закрыть вкладку, которая была нажата его кнопка закрытия:
private void tabControl1_MouseDown(object sender, MouseEventArgs e)
{
var lastIndex = this.tabControl1.TabCount - 1;
if (this.tabControl1.GetTabRect(lastIndex).Contains(e.Location))
{
this.tabControl1.TabPages.Insert(lastIndex, "New Tab");
this.tabControl1.SelectedIndex = lastIndex;
}
else
{
for (var i = 0; i < this.tabControl1.TabPages.Count; i++)
{
var tabRect = this.tabControl1.GetTabRect(i);
tabRect.Inflate(-2, -2);
var closeImage = Properties.Resources.DeleteButton_Image;
var imageRect = new Rectangle(
(tabRect.Right - closeImage.Width),
tabRect.Top + (tabRect.Height - closeImage.Height)/2,
closeImage.Width,
closeImage.Height);
if (imageRect.Contains(e.Location))
{
this.tabControl1.TabPages.RemoveAt(i);
break;
}
}
}
}
Предотвратить селектина последнюю вкладку
Чтобы предотвратить выделение на последнюю вкладку, вы можете справиться с Selecting
событие управления и проверить, если вкладка выбора является последней вкладкой, отменить событие:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPageIndex == this.tabControl1.TabCount - 1)
e.Cancel = true;
}
Приближайтесь кнопкой и кнопки Добавить
Чтобы нарисовать кнопку закрытия и добавить кнопку, вы можете обрабатывать событие DrawItem
. Я использовал эти значки для добавления и закройте кнопки .
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
var tabPage = this.tabControl1.TabPages[e.Index];
var tabRect = this.tabControl1.GetTabRect(e.Index);
tabRect.Inflate(-2, -2);
if (e.Index == this.tabControl1.TabCount - 1)
{
var addImage = Properties.Resources.AddButton_Image;
e.Graphics.DrawImage(addImage,
tabRect.Left + (tabRect.Width - addImage.Width)/2,
tabRect.Top + (tabRect.Height - addImage.Height)/2);
}
else
{
var closeImage = Properties.Resources.DeleteButton_Image;
e.Graphics.DrawImage(closeImage,
(tabRect.Right - closeImage.Width),
tabRect.Top + (tabRect.Height - closeImage.Height)/2);
TextRenderer.DrawText(e.Graphics, tabPage.Text, tabPage.Font,
tabRect, tabPage.ForeColor, TextFormatFlags.Left);
}
}
Adjust Tab Ширина
Для регулировки ширины вкладок и пусть последняя вкладка имеет меньшую ширину, вы можете hanlde HandleCreated
события и отправить TCM_SETMINTABWIDTH
для контроля и указать минимальный размер, разрешенный для вкладки ширина:
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private const int TCM_SETMINTABWIDTH = 0x1300 + 49;
private void tabControl1_HandleCreated(object sender, EventArgs e)
{
SendMessage(this.tabControl1.Handle, TCM_SETMINTABWIDTH, IntPtr.Zero, (IntPtr)16);
}
См. [TabControl и границы визуального сбоя] (http://stackoverflow.com/a/7785745/719186) – LarsTech
Я не уверен, как это связано с моим вопросом? Он попытался удалить пространство, на котором я хочу рисовать? – Jack
Вы пытаетесь рисовать область управления вкладками, а не в области страницы. Попробуйте адаптировать его к вашим потребностям. Может показаться мерцающим с тех пор, как TabControl делает стиль старой школы win32. – LarsTech