C# Winforms中选项卡页上的“关闭”按钮

C# Winforms中选项卡页上的“关闭”按钮,c#,winforms,tabs,tabcontrol,ownerdrawn,C#,Winforms,Tabs,Tabcontrol,Ownerdrawn,我正在尝试在TabControl和的选项卡页面上添加关闭按钮 当需要时,将关闭按钮的颜色从浅灰色更改为黑色 鼠标悬停在它上面。但是,颜色永远不会改变 创建DrawEventArgsCustom类以指示鼠标 悬停在关闭按钮上。如果这是真的,那么声明 更改颜色已执行,但颜色从不更改 private void tabControl1\u DrawItem(对象发送方,DrawItemEventArgs e) { 尝试 { 矩形r=e.界; r=this.tabControl1.GetTabRect(e

我正在尝试在TabControl和的选项卡页面上添加关闭按钮 当需要时,将关闭按钮的颜色从浅灰色更改为黑色 鼠标悬停在它上面。但是,颜色永远不会改变

创建DrawEventArgsCustom类以指示鼠标 悬停在关闭按钮上。如果这是真的,那么声明 更改颜色已执行,但颜色从不更改

private void tabControl1\u DrawItem(对象发送方,DrawItemEventArgs e)
{
尝试
{
矩形r=e.界;
r=this.tabControl1.GetTabRect(e.Index);
r、 偏移量(2,2);
画笔标题刷=新的SolidBrush(颜色为黑色);
画笔闭合画笔=新的SolidBrush(颜色为灰色);
笔刷CloseBrushSelected=新的SolidBrush(颜色为黑色);
Font f=这个.Font;
string title=this.tabControl1.TabPages[e.Index].Text;
e、 图形.抽绳(标题,f,标题栏,新点f(r.X,r.Y));
如果(e是付款人)
{
if(((抽屉文塔格斯库姆)e)!=null&((抽屉文塔格斯库姆)e)。HoverTrue==true)
e、 图形。抽绳(“x”,f,选定,新点f
(r.X+(此.tabControl1.GetTabRect(e.Index).Width-_imageLocation.X),_imageLocation.Y));
}
e、 图形。抽绳(“x”,f,CloseBrush,新点f
(r.X+(此.tabControl1.GetTabRect(e.Index).Width-_imageLocation.X),_imageLocation.Y));
}
捕获(例外情况除外)
{
}
}
私有无效选项卡控件1\u MouseMove(对象发送方,MouseEventArgs e)
{
矩形=新矩形(e.X,e.Y,1,1);
图形=CreateGraphics();
for(int i=0;i
无需创建新的
图形
对象,您应该在
DrawItem
事件中绘制所有图形。例如,在这方面:

//类级变量。
私有索引=-1;
私有无效选项卡Control1\u DrawItem(对象发送方,DrawItemEventArgs e)
{
var g=e.图形;
var tp=tabControl1.TabPages[e.Index];
var-rt=e.界;
var rx=新矩形(右-20,(右-12)(右-12))/2+1,12,12;
if((e.State&DrawItemState.Selected)!=DrawItemState.Selected)
{
rx.偏移量(0,2);
}
rt.充气(-rx.宽度,0);
rt偏移量(-(rx.Width/2),0;
使用(字体f=新字体(“Marlett”,8f))
使用(StringFormat sf=new StringFormat()
{
对齐=StringAlignment.Center,
LineAlignment=StringAlignment.Center,
修剪=StringTrimming.EllipsSchracter,
FormatFlags=StringFormatFlags.NoWrap,
})
{
g、 抽绳(tp.Text、tp.Font、Font、BRUSKS.Black、rt、sf);
g、 拉丝(“r”,f,悬停指数==e.指数?画笔。黑色:画笔。浅灰色,rx,sf);
}
tp.Tag=rx;
}
请注意,现在每个
TabPage
控件的
Tag
属性为
x
按钮保留一个矩形

MouseMove
事件中,通过
TabPages
迭代,从
Tag
属性中投射
x
矩形,检查
x
矩形是否包含当前
e.Location
,并调用
Invalidate()选项卡控件更新图形的方法:

private void tabControl1\u MouseMove(对象发送方,MouseEventArgs e)
{
for(int i=0;i
MouseLeave
事件中,如有必要,将失效:

private void tabControl1\u MouseLeave(对象发送方,事件参数e)
{
如果(悬停索引!=-1)
{
悬停指数=-1;
tabControl1.Invalidate();
}
}
要关闭/处理页面,请处理
MouseUp
事件:

private void tabControl1\u MouseUp(对象发送器,MouseEventArgs e)
{
for(int i=0;i
相关帖子