День добры, коллеги. Хочу добавить на табы крестик(Закрытие вкладки). Код ниже, отрабатывает отлично, за исключением одного глюка...о нём ниже
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
public partial class ExtendedTabControl : TabControl
{
private Dictionary<int, Rectangle> _tabCloseBtnPoints = new Dictionary<int, Rectangle>();
private bool _mouseOver = false;
public ExtendedTabControl()
{
this.DrawMode = TabDrawMode.OwnerDrawFixed;
this.DoubleBuffered = true;
this.ShowToolTips = true;
this.DrawItem += MyTabControl_DrawItem;
this.MouseMove += MyTabControl_MouseMove;
}
private void MyTabControl_MouseMove(object sender, MouseEventArgs e)
{
bool oldValue = _mouseOver;
_mouseOver = false;
foreach (var item in _tabCloseBtnPoints)
{
if (this.SelectedIndex == item.Key &&
item.Value.Contains(new Point(e.X, e.Y)))
{
_mouseOver = true;
break;
}
}
if (oldValue != _mouseOver)
this.Invalidate(_tabCloseBtnPoints[this.SelectedIndex]);
}
private void MyTabControl_DrawItem(object sender, DrawItemEventArgs e)
{
Graphics g = e.Graphics;
string toolTipText = this.TabPages[e.Index].Text;
#region Draw text
string sText = this.TabPages[e.Index].Text;
SizeF textSize = g.MeasureString(sText, this.Font);
int textX = e.Bounds.X + 5;
int textY = (int)(e.Bounds.Y + (e.Bounds.Height - textSize.Height) / 2);
//X - отступаем от края таба 5
//Y - Рисуем текс по середине контрола
//Длина зоны текста определяется как Длина Таба - отступ в 5 пикселей - (Длина картинки + отступы по краям картинки по 7 пикселей)
//Высота - высота текста
Rectangle textBoundsWithImage = new Rectangle
(
textX,
textY,
e.Bounds.Width - 5 - 30,
(int)textSize.Height
);
//Всё тоже самое, только длина зоны текста равна Длина таба - отступ по 5 пикселей слева/справа
Rectangle textBounds = new Rectangle
(
textX,
textY,
e.Bounds.Width - 10,
(int)textSize.Height
);
//Проверим, вмещается ли текс в отведенную для него зону
if (this.TabPages[e.Index] is IExtendedTabPage && ((IExtendedTabPage)this.TabPages[e.Index]).CanClose && textSize.Width > textBoundsWithImage.Width)
sText = sText.Substring(0, (int)((textBoundsWithImage.Width * sText.Length) / textSize.Width) - 3) + "...";
else if (textSize.Width > textBounds.Width)
sText = sText.Substring(0, (int)((textBounds.Width * sText.Length) / textSize.Width) - 3) + "...";
Font font = new System.Drawing.Font(this.Font, FontStyle.Regular);
g.DrawString(sText, this.Font, Brushes.Black, textX, textY);
#endregion
#region Draw button
if (this.SelectedIndex == e.Index &&
this.TabPages[e.Index] is IExtendedTabPage &&
((IExtendedTabPage)this.TabPages[e.Index]).CanClose)
{
int imageX = textBoundsWithImage.X + textBoundsWithImage.Width + 7;
int imageY = (int)(e.Bounds.Y + (e.Bounds.Height - 16) / 2);
if (!_tabCloseBtnPoints.ContainsKey(e.Index))
_tabCloseBtnPoints.Add(e.Index, new Rectangle(imageX, imageY, 16, 16));
if (!_mouseOver)
g.DrawImage(Properties.Resources.tabClose, imageX, imageY);
else
{
g.DrawImage(Properties.Resources.tabCloseActive, imageX, imageY);
//toolTipText = "Закрыть вкладку";
}
}
#endregion
if (this.TabPages[e.Index].ToolTipText != toolTipText)
this.TabPages[e.Index].ToolTipText = toolTipText;
}
}
Собственно о проблеме. Если я сниму комментарий со строки //toolTipText = "Закрыть вкладку"; текст вкладки при наведении мыши внезапно становится Bold. Кто может подсказать, в чем может быть проблема? Я даже шрифт статиком сделал Regular.
В ресурсах 2 картинки 16х16, взяты из Оперы:серый крестик, если мышь не наведена и белый крест внутри темно-серого квадрата, если мышь наведена.