0

我有一个tab-controlwith DrawModeset to 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();
    }

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

4

2 回答 2

0

首先GetTabRect没有做你认为它做的事情。它获取控件的边界矩形,即完全包围控件的矩形的大小。这不是具有颜色等它的属性的“控件” TabControl

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

如果是这样,最简单的方法是使用容器控件 ( FlowLayoutPanel, Panel, SplitContainer, TableLayoutPanel) 并将控件放入其中。

我创建了一个带有选项卡控件和选项卡上的面板控件的基本表单。以下代码在鼠标进入或离开面板控件边缘时更改背景颜色。如果您不想在代码中连接MouseEnter,MouseLeave事件,则无需...设计器将向您显示哪些控件具有这些事件并将它们连接到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 事件中)。我不会推荐这条路线,因为它会变得非常复杂并且可能会出现很多性能问题。

于 2013-09-20T12:57:36.547 回答
0

您需要调用选项卡控件的 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 变量来确定是否需要用不同的颜色绘制它。

于 2013-09-20T13:01:45.550 回答