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. }  
發佈了21 篇原創文章 · 獲贊 61 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章