更改选项卡控件中特定位置的颜色

本文关键字:定位 位置 颜色 选项 控件 | 更新日期: 2023-09-27 18:32:18

我有一个tab-controlDrawMode设置为OwnerDrawFixed。我希望当鼠标移动到tab-control中的特定位置时,应该更改该位置的颜色。我尝试过使用Rectangle但我被困在如何更改Rectangle的颜色上。

这就是我所拥有的。

    private void tabControl1_MouseMove(object sender, MouseEventArgs e)
    {
        for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
        {
            Rectangle r = tabControl1.GetTabRect(i);
            Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 12, 12);
            if (closeButton.Contains(e.Location))
            {
            }
        }
    }

编辑 : DrawItem代码

    private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.Graphics.DrawString("x", e.Font, Brushes.Red, e.Bounds.Right-16, e.Bounds.Top+4);
        e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + 12, e.Bounds.Top + 4);
        e.DrawFocusRectangle();
    }

我的问题是,如何为矩形着色,如果不可能,我可以使用什么其他方法?

更改选项卡控件中特定位置的颜色

您需要调用选项卡控件的 Invalidate() 方法来强制重绘。 像这样:

private int activeButton = -1;
private void tabControl1_MouseMove(object sender, MouseEventArgs e)
{
    int button;
    for (button = this.tabControl1.TabPages.Count-1; button >= 0; button--)
    {
        Rectangle r = tabControl1.GetTabRect(button);
        Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 12, 12);
        if (closeButton.Contains(e.Location)) break;
    }
    if (button != activeButton) {
        activeButton = button;
        tabControl1.Invalidate();
    }
}

并使用 DrawItem 事件处理程序中的 activeButton 变量来确定是否需要使用不同的颜色绘制它。

首先,

GetTabRect不会做你认为它做的事情。 它获取控件的边界矩形,该矩形是完全包围控件的矩形的大小。 这不是具有颜色等的"控件",而是TabControl的属性。

正如我理解您的问题一样,您在选项卡上有很多控件,并且您想在鼠标悬停在它们上方时突出显示其中的一些控件?

如果是这样,最简单的方法是使用容器控件(FlowLayoutPanelPanelSplitContainerTableLayoutPanel)并将控件放在其中。

我创建了一个基本窗体,该窗体上有一个选项卡控件和一个面板控件。 下面的代码在鼠标进入或离开面板控件边缘时更改背景颜色。 如果您不想,则无需在代码中连接MouseEnterMouseLeave事件...设计器将向你显示哪些控件具有这些事件,并在InitializeComponent()代码中连接它们。

    public Form1()
    {
        InitializeComponent();
        panel1.MouseEnter += new EventHandler(panel1_MouseEnter);
        panel1.MouseLeave += new EventHandler(panel1_MouseLeave);
    }
    void panel1_MouseLeave(object sender, EventArgs e)
    {
        panel1.BackColor = Color.Red;
    }
    void panel1_MouseEnter(object sender, EventArgs e)
    {
        panel1.BackColor = Color.PaleGoldenrod;
    }

如果我误解了,并且您想突出显示实际TabControl,那么,由于此控件根本没有任何颜色属性,您需要将 TabControl 放在另一个控件(如 Panel)中,或者按照建议在窗体上手动绘制(在 OnPaint 事件中)。 我不推荐这条路线,因为它可能会变得非常复杂,并且可能会有很多性能问题。