由於最近的項目需要,使用TabControl控件開發一個數據庫分布同步向導,在最后封裝時發現TabControl控件沒有現成的隱藏標簽的方法和屬性;真是急煞人也!想辦法解決吧。互聯網的功能就是強大,雖然沒有找到現成的解決方法,但我也了解的差不多了。經過嘗試可以以如下方式實現TabControl的標簽隱藏:
在窗體Load事件中添加:
- 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);
- }
以上兩步即可實現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);
- }
- }
- }
以下是對上面的例子代碼的一點說明: 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);
- }