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


    【方法一】

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

    在窗体Load事件中添加:

    [c-sharp] view plaincopy
    1. this.tabControl1.Region = new Region(new RectangleF(this.tabPage1.Left, this.tabPage1.Top, this.tabPage1.Width, this.tabPage1.Height));  

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

    [c-sharp] view plaincopy
    1. protected override bool ProcessCmdKey(ref Message msg, Keys keyData)  
    2. {  
    3.      switch (keyData)  
    4.      {  
    5.         case (Keys.Tab | Keys.Control):  
    6.              return true;  
    7.         default:  
    8.              break;  
    9.      }  
    10.      return base.ProcessCmdKey(ref msg, keyData);  
    11. }  

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

    【方法二】

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

    [c-sharp] view plaincopy
    1. public class FTabControl : System.Windows.Forms.TabControl{   
    2. private System.ComponentModel.Container components = null;   
    3. private static Color BackColor=Color.FromArgb(227,237,251);   
    4. private static Color ButtonColor;   
    5. private static Color ButtonHighlightColor;   
    6. private static Color BorderColor=Color.Black;   
    7. public bool UserChangeTab=true;   
    8.   
    9. public FTabControl(){   
    10. InitializeComponent();   
    11. SetDafaultStyle();   
    12. SetStyle(ControlStyles.UserPaint,true);   
    13. }   
    14.  
    15. #region Component Designer generated code   
    16. private void InitializeComponent(){   
    17. components = new System.ComponentModel.Container();   
    18. }   
    19. #endregion   
    20.   
    21. public void SetDafaultStyle(){   
    22. Appearance = System.Windows.Forms.TabAppearance.FlatButtons;   
    23. ButtonColor = Color.FromArgb(184,210,250);   
    24. ButtonHighlightColor = Color.FromArgb(144,187,252);   
    25. }   
    26.   
    27. protected override void OnPaint(PaintEventArgs e){   
    28. e.Graphics.FillRectangle(new SolidBrush(BackColor),e.ClipRectangle);   
    29. for (int i=0;i<this.TabCount;i++){   
    30. DrawItem(e.Graphics,i);   
    31. }   
    32. }   
    33.   
    34. protected void DrawItem(Graphics g,int index){   
    35. Rectangle r = GetTabRect(index);   
    36. r.Inflate(-2,-2);   
    37. if (SelectedIndex==index)   
    38. g.FillRectangle(new SolidBrush(ButtonHighlightColor),r);   
    39. else   
    40. g.FillRectangle(new SolidBrush(ButtonColor),r);   
    41. g.DrawRectangle(new Pen(new SolidBrush(BorderColor)),r);   
    42. r.Inflate(-3,-3);   
    43. g.DrawString(TabPages[index].Text,Font,new SolidBrush(BorderColor),r);   
    44. }   
    45.   
    46. protected override void WndProc(ref System.Windows.Forms.Message m){   
    47. if (m.Msg == 513 && !this.UserChangeTab ){   
    48. return; //trap WM_LBUTTONDOWN   
    49. }   
    50. else{   
    51. base.WndProc(ref m);   
    52. }   
    53. }   
    54.   
    55. protected override void OnKeyDown(KeyEventArgs e){   
    56. if(e.Control==true && e.KeyCode==System.Windows.Forms.Keys.Tab && !this.UserChangeTab){   
    57. return; //trap CTRL+TAB and CTRL+SHIFT+TAB   
    58. }   
    59. else{   
    60. base.OnKeyDown(e);   
    61. }   
    62. }   
    63. }   

    以下是对上面的例子代码的一点说明:  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值为负的就可以

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

    [c-sharp] view plaincopy
    1. if (this.tabMain.TabPages[ "tabpageThePage "] != null)   
    2. {   
    3. this.tabMain.TabPages.Remove(tabpageThePage);   
    4. }  
    5.   
    6. 当你想要显示的时候   
    7. if (this.tabMain.TabPages[ "tabpageThePage "] == null)   
    8. {   
    9. this.tabMain.TabPages.Add(tabpageThePage);   
    10. }  
  • 相关阅读:
    静态变量一定要先声明后赋值
    建议3 三元操作的类型必一致
    IDEA 创建 Maven web项目注意事项
    js不同类型作比较
    exception中return方法
    exception 打印出异常栈踪迹
    spring controller使用了@ResponseBody却返回xml
    springboot中的406(Not Acceptable)错误
    把本地建好的项目提交到git上
    java基础---------方法和方法重载
  • 原文地址:https://www.cnblogs.com/happylyyer/p/4305998.html
Copyright © 2020-2023  润新知