注意: 以下代码,属性直接赋值的语法糖要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 }
1 using System.ComponentModel; 2 using System.Drawing; 3 using System.Windows.Forms; 4 5 namespace RaywindStudio.Components 6 { 7 8 public partial class DataGViewX : DataGridView 9 { 10 public DataGViewX() 11 { 12 InitializeComponent(); 13 this.SetStyle(ControlStyles.UserPaint, true);//用户自己绘制 14 this.SetStyle(ControlStyles.ResizeRedraw, true); 15 this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 16 this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 17 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 18 } 19 20 private System.ComponentModel.IContainer components = null; 21 protected override void Dispose(bool disposing) 22 { 23 if (disposing && (components != null)) 24 { 25 components.Dispose(); 26 } 27 base.Dispose(disposing); 28 } 29 private void InitializeComponent() 30 { 31 components = new System.ComponentModel.Container(); 32 } 33 34 [DescriptionAttribute("自定义背景图:当BackTransparent=True时,忽略此设置,直接使用父容器背景")] 35 [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 36 public Image BackImage { get; set; } 37 38 [DescriptionAttribute("背景透明:当True时,直接使用父容器背景。否则使用BackImage填充背景")] 39 [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)] 40 public bool BackTransparent { get; set; } = true; 41 42 protected override void PaintBackground(Graphics graphics, Rectangle clipBounds, Rectangle gridBounds) 43 { 44 base.PaintBackground(graphics, clipBounds, gridBounds); 45 if(BackTransparent) 46 BackImage = GetBackImage(this.Parent, this.Left, this.Top, this.Width, this.Height); 47 if (BackImage != null) 48 graphics.DrawImage(BackImage, clipBounds); 49 } 50 51 public Bitmap GetBackImage(Control parent, int x, int y, int w, int h) 52 { 53 if (parent.BackgroundImage != null) 54 { 55 Bitmap bt = new Bitmap(parent.Width, parent.Height); 56 PictureBox pb = new PictureBox(); 57 pb.Size = parent.Size; 58 pb.BackgroundImage = parent.BackgroundImage; 59 pb.BackgroundImageLayout = parent.BackgroundImageLayout; 60 pb.DrawToBitmap(bt, pb.DisplayRectangle); 61 pb.Dispose(); 62 Bitmap destBitmap = new Bitmap(w, h); 63 Graphics g = Graphics.FromImage(destBitmap); 64 g.DrawImage(bt, new Rectangle(0, 0, w, h), new Rectangle(x, y, w, h), GraphicsUnit.Pixel); 65 bt.Dispose(); 66 g.Dispose(); 67 return destBitmap; 68 } 69 else 70 return null; 71 } 72 } 73 74 }