C# WinForm 自定义控件,DataGridView背景透明,TabControl背景透明

 注意: 以下代码,属性直接赋值的语法糖要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 }
TabCtrlX

 

 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 }
DataGViewX

 

posted @ 2017-04-19 11:28  enif  阅读(5428)  评论(2编辑  收藏  举报
豫ICP备2021034901号