【前言】
最近开始搞winform,要有一个美观大方的tabcontrol,并且可以关闭,偶然在网上的程序员之窗下载到一个,但是没有关闭按钮,所以我只能自己动手改装了。
我改装了两处地方,第一处,将close的图标绘制绘制出来--当鼠标在图标范围内则绘制选中样式的close按钮;
第二处:添加关闭事件,具体而言,当tabcontrol接收到点击事件时候,判断鼠标是不是在close范围,假如是,就调用remove方法去掉当前tab页面。
大概的代码如下:
/*
绘制关闭图标
*/
Bitmap oImage = CSharpWin.Properties.Resources.window_close;
Bitmap OImageSelected = CSharpWin.Properties.Resources.cross;
// g.DrawImage(oImage,new PointF(textRect.X+20,textRect.Height-20));
Rectangle closeRect = new Rectangle(tabRect.X + tabRect.Width - 12 - 9, tabRect.Y + tabRect.Height - 12 - 6, 16, 16);
if(closeRect.Contains(cusorPoint)){
g.DrawImage(OImageSelected, closeRect, 0, 0, 16, 16, GraphicsUnit.Pixel);
}
else{
g.DrawImage(oImage, closeRect, 0, 0, 16, 16, GraphicsUnit.Pixel);
}
/*绘制结束*/
/// <summary>
/// 这里是鼠标对tab的点击事件,当发生的时候,获取当前鼠标位置,假如在closebtn上面,那么就直接关闭。
/// </summary>
/// <param name="sender"></param>
/// <param name="agrs"></param>
private void init_click_handler(Object sender,MouseEventArgs agrs){
TabControl t1 = (TabControl)sender;
int cSelectedIndex = t1.SelectedIndex;
// MessageBox.Show("您点击了我,鼠标位置:" + agrs.X + " " + agrs.Y + " 当前选中的tab为:" +cSelectedIndex);
Rectangle rect1= t1.GetTabRect(t1.SelectedIndex);
// MessageBox.Show("当前选中的矩形信息为:left "+rect1.Left+",top "+rect1.Top+",width "+rect1.Width+",height "+rect1.Height+"");
Rectangle closeRect = new Rectangle(rect1.X + rect1.Width - 12 - 9, rect1.Y + rect1.Height - 12 - 6, 16, 16);
if (closeRect.Contains(new Point(agrs.X, agrs.Y))) {
// MessageBox.Show("在close按钮范围里面");
//--假如在close按钮里面,就关闭
// this.TabPages.RemoveAt(cSelectedIndex );
this.TabPages.Remove(this.TabPages[cSelectedIndex]);
}
}
放心,我下面将项目源代码放出来,大家可以去下载。运行环境:vs2010,net4.0.