【轉】C# WinForm 自定義控件,DataGridView背景透明,TabControl背景透明

原文:

https://www.cnblogs.com/leavind/p/6732530.html

C# WinForm下DataGridView繪製背景圖 - think8848 - 博客園 (cnblogs.com)

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章