关闭

C# TabControl 不显示选项卡标题

1719人阅读 评论(0) 收藏 举报
分类:

方法一:

在窗体Load事件中添加:

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

以上代码完成标签的隐藏,但还存在一个问题,就是Tab + Ctrl 可以切换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);
        }

这个依旧存在BUG,用Tab键,把焦点能放在选项卡上,然后用左右键控制。

如果加上屏蔽TAB键,和左右键,都可能导致一些用户操作上的BUG。


方法二:

隐藏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);
}
}
}

以下是对上面的例子代码的一点说明:
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标签的各种复杂视觉效果。


Hogwarts - S(u)ddenly dis@ppeared...

本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。  
为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32777次
    • 积分:448
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:53篇
    • 译文:0篇
    • 评论:0条
    文章分类