chaitanya556 Ответов: 1

Как добавить событие ввода мыши в динамически созданный графический прямоугольник в tabcontrol


Привет, у меня есть tabcontrol, в котором я добавляю tabpages через код. и в этом я добавляю картинку (которая является кнопкой закрытия) в заголовок вкладки.
я использую следующий код, чтобы дать кнопку закрытия заголовку вкладки.

Что я уже пробовал:

<pre> private void TabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
        {
            Image img = new Bitmap(Properties.Resources.CCloseBlack16x16,new Size(12,12));
            try
            {
                Font fnt;
                Brush backBrush;
                Brush foreBrush;
                if (e.Index == this.tabControl1.SelectedIndex)
                {

                    fnt = new Font(e.Font, FontStyle.Bold | FontStyle.Bold);
                    fnt = new Font(e.Font, FontStyle.Bold);
                    backBrush = new System.Drawing.SolidBrush(Color.FromArgb(16, 128, 128));
                    // this.tabControl1.SelectedTab.BackColor = Color.FromArgb(16, 128, 128);
                    foreBrush = new SolidBrush(Color.White);

                }
                else
                {
                    fnt = e.Font;
                    backBrush = new SolidBrush(Color.White);
                    foreBrush = new SolidBrush(Color.Black);
                }

                string tabName = this.tabControl1.TabPages[e.Index].Text;
                StringFormat sf = new StringFormat();
                sf.Alignment = StringAlignment.Center;

                e.Graphics.FillRectangle(backBrush, e.Bounds);
                Rectangle r = e.Bounds;
                r = new Rectangle(r.X, r.Y + 3, r.Width + 10, r.Height - 0);
                e.Graphics.DrawString(tabName, fnt, foreBrush, r, sf);
                e.Graphics.DrawImage(img, new Point(r.X + (this.tabControl1.GetTabRect(e.Index).Width - _imageLocation.X - 5), _imageLocation.Y ));
                this.tabControl1.SelectedTab.BackColor = Color.FromArgb(16, 128, 128);     
                sf.Dispose();
                if (e.Index == this.tabControl1.SelectedIndex)
                {
                    fnt.Dispose();
                    backBrush.Dispose();
                }
                else
                {
                    backBrush.Dispose();
                    foreBrush.Dispose();
                }                
            }
            catch (Exception) { }

        }


но мне нужно событие ввода мыши и выхода мыши (в котором я должен дать другое изображение) для этого конкретного изображения, которое я добавил в заголовок вкладки.
пожалуйста, помогите мне решить эту проблему.

1 Ответов

Рейтинг:
2

RickZeeland

Для стандарта Элемент управления TabControl вы можете сделать что-то вроде этого, не очень элегантно, но это работает:

private void tabControl1_MouseEnter(object sender, EventArgs e)
{
    TabControl tab = sender as TabControl;
    Point tabpos = tab.PointToClient(Cursor.Position);
    Debug.Print("MouseEnter " + tab.SelectedTab.Name);
    Debug.Print("MouseEnter " + tabpos);

    if (tabpos.X < tabControl1.ItemSize.Width)
    {
        Debug.Print("Tab 1");
    }
    else
    {
        Debug.Print("Tab 2");
    }
}

Для пользовательского элемента управления, подобного этому: Рисование Собственных Вкладок - Второе Издание[^]
Вы можете изменить код CustomTabControl подобный этому:
protected override void OnMouseEnter(EventArgs e)
{
    Debug.Print("OnMouseEnter");
    base.OnMouseEnter(e);
}

А вот этот: Скошенная панель с эффектом тени - теперь с вкладками[^]
Вы можете изменить это следующим образом:
public class AdvancedTab : Panel
...
	public AdvancedTab()
	{
		this.Size = new Size(440, 40);
		this.Paint += this.AdvancedTab_Paint;
		this.MouseEnter += this.TabMouseEnter;
		...
	}

	private void TabMouseEnter(object sender, System.EventArgs e)
	{
		Debug.Print("TabMouseEnter");
	}


chaitanya556

на самом деле мой код формы немного длиннее. поэтому я не могу изменить весь код, чтобы создать новый настроенный tabcontrol. мне нужно получить стиль закрытия вкладки chrome (когда вы держите мышь, мне нужно получить изображение красного цвета при наведении мыши). мне нужно реализовать, чтобы элемент управления TabControl по умолчанию без создания настраиваемого управления TabControl. пожалуйста, направьте меня, чтобы сделать это для моего проекта
Спасибо