注意: 以下代码,属性直接赋值的语法糖要vs2015以上才支持。
1 using System.ComponentModel; 2 using System.Drawing; 3 using System.Windows.Forms; 4 namespace RaywindStudio.Components 5 { 6 public class TabCtrlX : TabControl 7 { 8 public TabCtrlX() 9 { 10 InitializeComponent(); 11 this.SetStyle(ControlStyles.UserPaint, true);//用户自己绘制 12 this.SetStyle(ControlStyles.ResizeRedraw, true); 13 this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 14 this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 15 //让控件支持透明色 16 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 17 } 18 19 #region designer 20 /// <summary> 21 /// 必需的设计器变量。 22 /// </summary> 23 private System.ComponentModel.IContainer components = null; 24 25 /// <summary> 26 /// 清理所有正在使用的资源。 27 /// </summary> 28 /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> 29 protected override void Dispose(bool disposing) 30 { 31 if (disposing && (components != null)) 32 { 33 components.Dispose(); 34 } 35 base.Dispose(disposing); 36 } 37 38 #region 组件设计器生成的代码 39 40 /// <summary> 41 /// 设计器支持所需的方法 - 不要 42 /// 使用代码编辑器修改此方法的内容。 43 /// </summary> 44 private void InitializeComponent() 45 { 46 components = new System.ComponentModel.Container(); 47 } 48 49 #endregion 50 #endregion 51 //[EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 52 public override Color BackColor { 53 get { 54 return Color.FromArgb(Alpha, BgColor); 55 } 56 set { 57 Alpha = BackColor.A; 58 BgColor = BackColor; 59 } 60 } 61 62 [DisplayName("Color.Alpha")] 63 [CategoryAttribute("Color"), DescriptionAttribute("Opacity不透明度0--255")] 64 [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 65 public byte Alpha { get; set; } = 16; 66 67 [DisplayName("Color.BgColor")] 68 [CategoryAttribute("Color"), DescriptionAttribute("TabControl工作区背景色")] 69 [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 70 public Color BgColor { get; set; } = Color.White; 71 72 [DisplayName("Color.BordColor")] 73 [CategoryAttribute("Color"), DescriptionAttribute("TabControl边线颜色")] 74 [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 75 public Color BordColor { get; set; } = Color.LightGray; 76 77 [DisplayName("Color.TitleColor")] 78 [CategoryAttribute("Color"), DescriptionAttribute("TabPage标头背景色")] 79 [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 80 public Color TitleColor { get; set; } = Color.WhiteSmoke; 81 82 [DisplayName("Color.TitleSeleColor")] 83 [CategoryAttribute("Color"), DescriptionAttribute("TabPage标头选中背景色")] 84 [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 85 public Color TitleSeleColor { get; set; } = Color.White; 86 87 [DisplayName("Color.TextColor")] 88 [CategoryAttribute("Color"), DescriptionAttribute("TabPage标题颜色")] 89 [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 90 public Color TextColor { get; set; } = Color.Gray; 91 92 [DisplayName("Color.TextSeleColor")] 93 [CategoryAttribute("Color"), DescriptionAttribute("TabPage选中标题颜色")] 94 [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 95 public Color TextSeleColor { get; set; } = Color.Black; 96 97 protected override void OnPaint(PaintEventArgs e) 98 { 99 this.DrawTitle(e.Graphics); 100 base.OnPaint(e); 101 DrawBorder(e.Graphics); 102 } 103 104 protected void DrawBorder(Graphics g) 105 { 106 g.DrawRectangle(new Pen(BordColor, 1F), ClientRectangle); 107 } 108 109 protected void DrawTitle(Graphics g) 110 { 111 StringFormat sf = new StringFormat(); 112 sf.Alignment = StringAlignment.Center; 113 sf.LineAlignment = StringAlignment.Center; 114 using (SolidBrush sb = new SolidBrush(SystemColors.Control)) 115 { 116 for (int i = 0; i < this.TabPages.Count; i++) 117 { 118 Rectangle rect = this.GetTabRect(i); 119 if (this.SelectedIndex == i) 120 { 121 sb.Color = TitleSeleColor; 122 g.FillRectangle(sb, rect); 123 g.DrawString(this.TabPages[i].Text, this.Font, new SolidBrush(TextSeleColor), rect, sf); 124 } 125 else 126 { 127 sb.Color = TitleColor; 128 g.FillRectangle(sb, rect); 129 g.DrawString(this.TabPages[i].Text, this.Font, new SolidBrush(TextColor), rect, sf); 130 } 131 } 132 } 133 } 134 } 135 }