在 C# Windows Form 的 tabpage 选项卡标题中添加关闭按钮
Adding close button in tabpage tab caption in C# Windows Form
我正在尝试在 tabcontrol 的 tabpage 面板上添加关闭按钮或 'X',我已通过阅读此 Whosebug question 成功完成此操作。
问题是标签页标题和 X 符号合并在一起了。我发现标签页标题面板没有根据标题文本调整大小。
代码如下:
//This code will render a "x" mark at the end of the Tab caption.
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+5, e.Bounds.Top + 4);
e.DrawFocusRectangle();
结果在这里我已经更改了 e.bounds.right
值,但它仍然不起作用。
确保设置 DrawMode property of the Tab Control to OwnerDrawFixed。这个属性决定是系统还是开发者绘制字幕。
这是使用 TabSizeMode = Fixed 设置制表符大小的代码示例:
public partial class Form1 : Form
{
const int LEADING_SPACE = 12;
const int CLOSE_SPACE = 15;
const int CLOSE_AREA = 15;
public Form1()
{
InitializeComponent();
}
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
//This code will render a "x" mark at the end of the Tab caption.
e.Graphics.DrawString("x", e.Font, Brushes.Black, e.Bounds.Right - CLOSE_AREA, e.Bounds.Top + 4);
e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + LEADING_SPACE, e.Bounds.Top + 4);
e.DrawFocusRectangle();
}
private void Form1_Load(object sender, EventArgs e)
{
// get the inital length
int tabLength = tabControl1.ItemSize.Width;
// measure the text in each tab and make adjustment to the size
for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
{
TabPage currentPage = tabControl1.TabPages[i];
int currentTabLength = TextRenderer.MeasureText(currentPage.Text, tabControl1.Font).Width;
// adjust the length for what text is written
currentTabLength += LEADING_SPACE + CLOSE_SPACE + CLOSE_AREA;
if (currentTabLength > tabLength)
{
tabLength = currentTabLength;
}
}
// create the new size
Size newTabSize = new Size(tabLength, tabControl1.ItemSize.Height);
tabControl1.ItemSize = newTabSize;
}
}
上面示例代码的屏幕截图:
要修复合并的 tabPage.Text 和另外绘制的 "X" 只需添加:
tabControl.Padding = new System.Drawing.Point(21, 3);
它会在每个 tabPage
的末尾添加一些额外的 space
我正在尝试在 tabcontrol 的 tabpage 面板上添加关闭按钮或 'X',我已通过阅读此 Whosebug question 成功完成此操作。
问题是标签页标题和 X 符号合并在一起了。我发现标签页标题面板没有根据标题文本调整大小。
代码如下:
//This code will render a "x" mark at the end of the Tab caption.
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+5, e.Bounds.Top + 4);
e.DrawFocusRectangle();
结果在这里我已经更改了 e.bounds.right
值,但它仍然不起作用。
确保设置 DrawMode property of the Tab Control to OwnerDrawFixed。这个属性决定是系统还是开发者绘制字幕。
这是使用 TabSizeMode = Fixed 设置制表符大小的代码示例:
public partial class Form1 : Form
{
const int LEADING_SPACE = 12;
const int CLOSE_SPACE = 15;
const int CLOSE_AREA = 15;
public Form1()
{
InitializeComponent();
}
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
//This code will render a "x" mark at the end of the Tab caption.
e.Graphics.DrawString("x", e.Font, Brushes.Black, e.Bounds.Right - CLOSE_AREA, e.Bounds.Top + 4);
e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + LEADING_SPACE, e.Bounds.Top + 4);
e.DrawFocusRectangle();
}
private void Form1_Load(object sender, EventArgs e)
{
// get the inital length
int tabLength = tabControl1.ItemSize.Width;
// measure the text in each tab and make adjustment to the size
for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
{
TabPage currentPage = tabControl1.TabPages[i];
int currentTabLength = TextRenderer.MeasureText(currentPage.Text, tabControl1.Font).Width;
// adjust the length for what text is written
currentTabLength += LEADING_SPACE + CLOSE_SPACE + CLOSE_AREA;
if (currentTabLength > tabLength)
{
tabLength = currentTabLength;
}
}
// create the new size
Size newTabSize = new Size(tabLength, tabControl1.ItemSize.Height);
tabControl1.ItemSize = newTabSize;
}
}
上面示例代码的屏幕截图:
要修复合并的 tabPage.Text 和另外绘制的 "X" 只需添加:
tabControl.Padding = new System.Drawing.Point(21, 3);
它会在每个 tabPage
的末尾添加一些额外的 space