powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / TabControl лаги с прорисовкой
2 сообщений из 2, страница 1 из 1
TabControl лаги с прорисовкой
    #38751605
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добры, коллеги. Хочу добавить на табы крестик(Закрытие вкладки). Код ниже, отрабатывает отлично, за исключением одного глюка...о нём ниже
Код: c#
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, взяты из Оперы:серый крестик, если мышь не наведена и белый крест внутри темно-серого квадрата, если мышь наведена.
...
Рейтинг: 0 / 0
TabControl лаги с прорисовкой
    #38751959
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил проблему, добавил
Код: c#
1.
g.FillRectangle(new SolidBrush(SystemColors.Control), e.Bounds);

перед прорисовкой текста
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / TabControl лаги с прорисовкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]