tabcontrol 控件的标签的隐藏【C#】

【方法一】

由于最近的项目需要,使用TabControl控件开发一个数据库分布同步向导,在最后封装时发现TabControl控件没有现成的隐藏标签的方法和属性;真是急煞人也!想办法解决吧。互联网的功能就是强大,虽然没有找到现成的解决方法,但我也了解的差不多了。经过尝试可以以如下方式实现TabControl的标签隐藏:

在窗体Load事件中添加:

this.tabControl1.Region = new Region(new RectangleF(this.tabPage1.Left, this.tabPage1.Top, this.tabPage1.Width, this.tabPage1.Height)); 
this.tabControl1.Region = new Region(new RectangleF(this.tabPage1.Left, this.tabPage1.Top, this.tabPage1.Width, this.tabPage1.Height));

以上代码完成标签的隐藏,但还存在一个问题,就是 Ctrl +Tab 可以切换TabControl中的页,可以通过捕捉按键消息屏蔽 组合键:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)  
{  
     switch (keyData)  
     {  
        case (Keys.Tab | Keys.Control):  
             return true;  
        default:  
             break;  
     }  
     return base.ProcessCmdKey(ref msg, keyData);  
} 
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
     switch (keyData)
     {
        case (Keys.Tab | Keys.Control):
             return true;
        default:
             break;
     }
     return base.ProcessCmdKey(ref msg, keyData);
}

以上两步即可实现TabControl 标签的隐藏,如果要效果理想,可以调整TabControl 的appearance属性设置TabControl 的绘制方式。

【方法二】

隐藏TabControl的标签必须通过继承TabControl并自行重画来实现。下面是一个重画TabControl的完整的例子:

public class FTabControl : System.Windows.Forms.TabControl{   
	private System.ComponentModel.Container components = null;   
	private static Color BackColor=Color.FromArgb(227,237,251);   
	private static Color ButtonColor;   
	private static Color ButtonHighlightColor;   
	private static Color BorderColor=Color.Black;   
	public bool UserChangeTab=true;   
	 
	public FTabControl(){   
		InitializeComponent();   
		SetDafaultStyle();   
		SetStyle(ControlStyles.UserPaint,true);   
	}  
	 
	#region Component Designer generated code   
	private void InitializeComponent(){   
		components = new System.ComponentModel.Container();   
	}  
	#endregion   
	 
	public void SetDafaultStyle(){   
		Appearance = System.Windows.Forms.TabAppearance.FlatButtons;   
		ButtonColor = Color.FromArgb(184,210,250);   
		ButtonHighlightColor = Color.FromArgb(144,187,252);   
	}   
	 
	protected override void OnPaint(PaintEventArgs e){   
		e.Graphics.FillRectangle(new SolidBrush(BackColor),e.ClipRectangle);   
		for (int i=0;i<this.TabCount;i++){   
			DrawItem(e.Graphics,i);   
		}   
	}   
	 
	protected void DrawItem(Graphics g,int index){   
		Rectangle r = GetTabRect(index);   
		r.Inflate(-2,-2);   
		if (SelectedIndex==index)   
		g.FillRectangle(new SolidBrush(ButtonHighlightColor),r);   
		else   
		g.FillRectangle(new SolidBrush(ButtonColor),r);   
		g.DrawRectangle(new Pen(new SolidBrush(BorderColor)),r);   
		r.Inflate(-3,-3);   
		g.DrawString(TabPages[index].Text,Font,new SolidBrush(BorderColor),r);   
	}   
	 
	protected override void WndProc(ref System.Windows.Forms.Message m){   
		if (m.Msg == 513 && !this.UserChangeTab ){   
			return; //trap WM_LBUTTONDOWN   
		}   
		else{   
			base.WndProc(ref m);   
		}   
	}   
	 
	protected override void OnKeyDown(KeyEventArgs e){   
		if(e.Control==true && e.KeyCode==System.Windows.Forms.Keys.Tab && !this.UserChangeTab){   
			return; //trap CTRL+TAB and CTRL+SHIFT+TAB   
		} 
		else{   
			base.OnKeyDown(e);   
		}   
	}   
}  
public class FTabControl : System.Windows.Forms.TabControl{
	private System.ComponentModel.Container components = null;
	private static Color BackColor=Color.FromArgb(227,237,251);
	private static Color ButtonColor;
	private static Color ButtonHighlightColor;
	private static Color BorderColor=Color.Black;
	public bool UserChangeTab=true;

	public FTabControl(){
		InitializeComponent();
		SetDafaultStyle();
		SetStyle(ControlStyles.UserPaint,true);
	}

	#region Component Designer generated code
	private void InitializeComponent(){
		components = new System.ComponentModel.Container();
	}
	#endregion

	public void SetDafaultStyle(){
		Appearance = System.Windows.Forms.TabAppearance.FlatButtons;
		ButtonColor = Color.FromArgb(184,210,250);
		ButtonHighlightColor = Color.FromArgb(144,187,252);
	}

	protected override void OnPaint(PaintEventArgs e){
		e.Graphics.FillRectangle(new SolidBrush(BackColor),e.ClipRectangle);
		for (int i=0;i<this.TabCount;i++){
			DrawItem(e.Graphics,i);
		}
	}

	protected void DrawItem(Graphics g,int index){
		Rectangle r = GetTabRect(index);
		r.Inflate(-2,-2);
		if (SelectedIndex==index)
			g.FillRectangle(new SolidBrush(ButtonHighlightColor),r);
		else
			g.FillRectangle(new SolidBrush(ButtonColor),r);
		g.DrawRectangle(new Pen(new SolidBrush(BorderColor)),r);
		r.Inflate(-3,-3);
		g.DrawString(TabPages[index].Text,Font,new SolidBrush(BorderColor),r);
	}

	protected override void WndProc(ref System.Windows.Forms.Message m){
		if (m.Msg == 513 && !this.UserChangeTab ){
			return; //trap WM_LBUTTONDOWN
		}
		else{
			base.WndProc(ref m);
		}
	}

	protected override void OnKeyDown(KeyEventArgs e){
		if(e.Control==true && e.KeyCode==System.Windows.Forms.Keys.Tab && !this.UserChangeTab){
			return; //trap CTRL+TAB and CTRL+SHIFT+TAB
		}
		else{
			base.OnKeyDown(e);
		}
	}
}


 

以下是对上面的例子代码的一点说明:
1) public bool UserChangeTab成员的作用是规定是否允许用户在界面上通过鼠标点击标签和按"Ctrl+Tab"来改变当前标签页。
2) 在构造函数中调用SetStyle()的目的是告诉系统这个控件将自行重画,而不是用系统默认的显示方式。
3) OnPaint()完成的就是自行重画的工作,其中调用了DrawItem函数来重画所有的标签。
4) SetDafaultStyle()的功能是设定一些默认的颜色和界面风格。
5) 最重要的就是重载WndProc()和OnKeyDown()函数。在这两个重载函数中捕获了鼠标点击事件以及键盘输入事件。一旦this.UserChangeTab的值为false(即不允许用户来改变标签页),则将捕获的事件销毁,不再传递给基类的事件处理函数。

使用这个FTabControl时,
1) 如果需要禁止用户通过鼠标或者Ctrl+Tab改变标签页,需要设定UserChangeTab为false。
2) 如果需要隐藏标签,需要将FTabControl的ItemSize属性设为(1,1),并适当调整颜色设置以达到视觉上看不出的效果。

需要说明的是,通过上面这个例子,不但可以实现隐藏Tab标签、禁止用户改变标签等功能,通过扩充DrawItem函数还可以实现Tab标签的各种复杂视觉效果。 

【方法三】

关于如何把TabControl 的上面的tab头(page页标签)隐藏

许多网友问这个问题,实际上无法办到。我找到了一个替代的办法,效果基本满足。

即:设置TabControl的ItemSize(1,1),大家有爱好的话可以一试。

<网友回复>
那这样要TabControl干嘛啊?

可以用Panel把它装起来,设置Location的Y值为负的就可以


<网友回复>当你想要隐藏的时候

if (this.tabMain.TabPages[ "tabpageThePage "] != null)   
{   
    this.tabMain.TabPages.Remove(tabpageThePage);   
}  


 
当你想要显示的时候   

if (this.tabMain.TabPages[ "tabpageThePage "] == null)   
{   
    this.tabMain.TabPages.Add(tabpageThePage);   
} 

本文来自CSDN博客,转载请标明出处:tabcontrol 控件的标签的隐藏【C#】_wonsoft的博客-CSDN博客_wpf tabcontrol标签超出隐藏

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木叶流丹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值