更改选项卡控件中特定位置的颜色
本文关键字:定位 位置 颜色 选项 控件 | 更新日期: 2023-09-27 18:32:18
我有一个tab-control
,DrawMode
设置为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
的属性。
正如我理解您的问题一样,您在选项卡上有很多控件,并且您想在鼠标悬停在它们上方时突出显示其中的一些控件?
如果是这样,最简单的方法是使用容器控件(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 事件中)。 我不推荐这条路线,因为它可能会变得非常复杂,并且可能会有很多性能问题。