官网
前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
来都来了,点个【推荐】再走吧,谢谢
NuGet
Install-Package HZH_Controls
目录
http://www.hzhcontrols.com/blog-63.html
用处及效果
准备工作
这个是在前面滚动条上完善的,加入了对常用控件滚动条的美化,实现逻辑是添加一个滚动条控件,然后覆盖在滚动条上面,然后实现联动
绘制滚动条的工作,你可以参考
(六十九)c#Winform自定义控件-垂直滚动条-HZHControls
开始
添加一个组件ScrollbarComponent,
实现接口IExtenderProvider
1 Dictionary<Control, bool> m_controlCache = new Dictionary<Control, bool>();
2 public bool CanExtend(object extendee)
3 {
4 if (extendee is ScrollableControl)
5 {
6 ScrollableControl control = (ScrollableControl)extendee;
7 if (control.AutoScroll == true)
8 {
9 return true;
10 }
11 }
12 else if (extendee is TreeView)
13 {
14 TreeView control = (TreeView)extendee;
15 if (control.Scrollable)
16 {
17 return true;
18 }
19 }
20 else if (extendee is TextBox)
21 {
22 TextBox control = (TextBox)extendee;
23 if (control.Multiline && control.ScrollBars != ScrollBars.None)
24 {
25 return true;
26 }
27 }
28 else if (extendee is RichTextBox)
29 {
30 return true;
31 }
32 else if (extendee is ListBox)
33 {
34 return true;
35 }
36 //else if (extendee is ListView)
37 //{
38 // return true;
39 //}
40 else if (extendee is DataGridView)
41 {
42 return true;
43 }
44 return false;
45 }
添加扩展属性
1 [Browsable(true), Category("自定义属性"), Description("是否使用自定义滚动条"), DisplayName("UserCustomScrollbar"), Localizable(true)]
2 public bool GetUserCustomScrollbar(Control control)
3 {
4 if (m_controlCache.ContainsKey(control))
5 return m_controlCache[control];
6 return true;
7 }
8
9 public void SetUserCustomScrollbar(Control control, bool blnUserCustomScrollbar)
10 {
11 m_controlCache[control] = blnUserCustomScrollbar;
12 if (!blnUserCustomScrollbar)
13 return;
14
15 if (control is TreeView)
16 {
17 TreeView tv = (TreeView)control;
18 //tv.MouseWheel += tv_MouseWheel;
19 //tv.AfterSelect += tv_AfterSelect;
20 tv.AfterExpand += tv_AfterExpand;
21 tv.AfterCollapse += tv_AfterCollapse;
22 }
23 else if (control is TextBox)
24 {
25 TextBox txt = (TextBox)control;
26 //txt.MouseWheel += txt_MouseWheel;
27 txt.TextChanged += txt_TextChanged;
28 txt.KeyDown += txt_KeyDown;
29 }
30 else if (control is RichTextBox)
31 {
32 RichTextBox txt = (RichTextBox)control;
33 //txt.MouseWheel += txt_MouseWheel;
34 txt.TextChanged += txt_TextChanged;
35 txt.KeyDown += txt_KeyDown;
36 }
37 else if (control is ListBox)
38 {
39 ListBox lb = (ListBox)control;
40 lb.DataSourceChanged += Lb_DataSourceChanged;
41 lb.SelectedIndexChanged += Lb_SelectedIndexChanged;
42 }
43 //else if (control is ListView)
44 //{
45 // ListView lv = (ListView)control;
46
47 //}
48 else if (control is DataGridView)
49 {
50 DataGridView dgv = (DataGridView)control;
51 dgv.DataSourceChanged += dgv_DataSourceChanged;
52 dgv.RowsAdded += dgv_RowsAdded;
53 dgv.RowsRemoved += dgv_RowsRemoved;
54 dgv.Scroll += dgv_Scroll;
55 }
56
57 control.VisibleChanged += control_VisibleChanged;
58 control.SizeChanged += control_SizeChanged;
59 control.LocationChanged += control_LocationChanged;
60 control.Disposed += control_Disposed;
61 control.MouseWheel += Control_MouseWheel;
62 control_SizeChanged(control, null);
63 }
控件大小改变的时候处理滚动条显示
1 void control_SizeChanged(object sender, EventArgs e)
2 {
3 if (ControlHelper.IsDesignMode())
4 {
5 return;
6 }
7 else
8 {
9 var control = sender as Control;
10
11 bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0;
12 bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0;
13 if (control is TextBox)
14 {
15 var txt = (TextBox)control;
16 if (txt.ScrollBars == ScrollBars.Both)
17 {
18 blnHasVScrollbar = true;
19 blnHasHScrollbar = true;
20 }
21 else if (txt.ScrollBars == ScrollBars.Vertical)
22 {
23 blnHasVScrollbar = true;
24 blnHasHScrollbar = false;
25 }
26 else if (txt.ScrollBars == ScrollBars.Horizontal)
27 {
28 blnHasVScrollbar = false;
29 blnHasHScrollbar = true;
30 }
31 else
32 {
33 blnHasVScrollbar = false;
34 blnHasHScrollbar = false;
35 }
36 }
37 else if (control is DataGridView)
38 {
39 var dgv = (DataGridView)control;
40 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical)
41 {
42 int _height = dgv.RowTemplate.Height * dgv.Rows.Count;
43 if (dgv.ColumnHeadersVisible)
44 {
45 _height += dgv.ColumnHeadersHeight;
46 }
47 blnHasVScrollbar = _height > dgv.Height;
48 }
49 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)
50 {
51 int _width = 0;
52 foreach (DataGridViewColumn com in dgv.Columns)
53 {
54 _width += com.Width;
55 }
56 if (dgv.RowHeadersVisible)
57 {
58 _width += dgv.RowHeadersWidth;
59 }
60 blnHasHScrollbar = _width > dgv.Width;
61 }
62 }
63 else if (control is ListView)
64 {
65 if (!((ListView)control).Scrollable)
66 {
67 blnHasVScrollbar = false;
68 blnHasHScrollbar = false;
69 }
70 }
71 if (blnHasVScrollbar)
72 {
73 if (!m_lstVCache.ContainsKey(control))
74 {
75 if (control.Parent != null)
76 {
77 UCVScrollbar barV = new UCVScrollbar();
78 barV.SmallChange = 5;
79 barV.Width = SystemInformation.VerticalScrollBarWidth + 1;
80 barV.Scroll += barV_Scroll;
81 m_lstVCache[control] = barV;
82 if (blnHasHScrollbar)
83 {
84 barV.Height = control.Height - barV.Width;
85 }
86 else
87 {
88 barV.Height = control.Height;
89 }
90 SetVMaxNum(control);
91 barV.Location = new System.Drawing.Point(control.Right - barV.Width, control.Top);
92 control.Parent.Controls.Add(barV);
93 int intControlIndex = control.Parent.Controls.GetChildIndex(control);
94 control.Parent.Controls.SetChildIndex(barV, intControlIndex);
95 }
96 }
97 else
98 {
99 if (blnHasHScrollbar)
100 {
101 m_lstVCache[control].Height = control.Height - m_lstVCache[control].Width;
102 }
103 else
104 {
105 m_lstVCache[control].Height = control.Height;
106 }
107 SetVMaxNum(control);
108 }
109 }
110 else
111 {
112 if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null)
113 {
114 m_lstVCache[control].Visible = false;
115 }
116 }
117
118 if (blnHasHScrollbar)
119 {
120 if (!m_lstHCache.ContainsKey(control))
121 {
122 if (control.Parent != null)
123 {
124 UCHScrollbar barH = new UCHScrollbar();
125 barH.Height = SystemInformation.HorizontalScrollBarHeight + 1;
126 barH.SmallChange = 5;
127
128 barH.Scroll += barH_Scroll;
129 m_lstHCache[control] = barH;
130 if (blnHasHScrollbar)
131 {
132 barH.Width = control.Width - barH.Height;
133 }
134 else
135 {
136 barH.Width = control.Width;
137 }
138 SetHMaxNum(control);
139 barH.Location = new System.Drawing.Point(control.Left, control.Bottom - barH.Height);
140 control.Parent.Controls.Add(barH);
141 int intControlIndex = control.Parent.Controls.GetChildIndex(control);
142 control.Parent.Controls.SetChildIndex(barH, intControlIndex);
143 }
144 }
145 else
146 {
147 if (blnHasHScrollbar)
148 {
149 m_lstHCache[control].Width = control.Width - m_lstHCache[control].Height;
150 }
151 else
152 {
153 m_lstHCache[control].Width = control.Width;
154 }
155 SetHMaxNum(control);
156 }
157 }
158 else
159 {
160 if (m_lstHCache.ContainsKey(control))
161 {
162 if (m_lstHCache[control].Visible && m_lstHCache[control].Parent != null)
163 {
164 m_lstHCache[control].Visible = false;
165 }
166 }
167 }
168 }
169 ResetScrollLocation(sender);
170 }
修改横竖滚动条值
1 private void SetVMaxNum(Control control)
2 {
3 if (!m_lstVCache.ContainsKey(control))
4 return;
5 var intoV = ControlHelper.GetVScrollBarInfo(control.Handle);
6 UCVScrollbar barV = m_lstVCache[control];
7 if (control is ScrollableControl)
8 {
9 barV.Maximum = intoV.ScrollMax;
10 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;
11 barV.Value = intoV.nPos;
12 barV.BringToFront();
13 // barV.Maximum = (control as ScrollableControl).VerticalScroll.Maximum;
14 // barV.Value = (control as ScrollableControl).VerticalScroll.Value;
15 }
16 else if (control is TreeView)
17 {
18 var tv = control as TreeView;
19 barV.Maximum = intoV.ScrollMax * tv.ItemHeight;
20 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;
21 barV.Value = intoV.nPos * tv.ItemHeight;
22 barV.BringToFront();
23
24 //barV.Maximum = GetTreeNodeMaxY(control as TreeView) - control.Height;
25 //barV.Value = (control as TreeView).AutoScrollOffset.Y;
26 }
27 else if (control is TextBox)
28 {
29 TextBox txt = (TextBox)control;
30 barV.Maximum = intoV.ScrollMax * txt.PreferredHeight;
31 if (txt.ScrollBars == ScrollBars.Both || txt.ScrollBars == ScrollBars.Vertical)
32 {
33 barV.Visible = true;
34 }
35 else
36 {
37 barV.Visible = false;
38 }
39 barV.Value = intoV.nPos * txt.PreferredHeight;
40 barV.BringToFront();
41 }
42 else if (control is RichTextBox)
43 {
44 bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0;
45 barV.Maximum = intoV.ScrollMax;
46 barV.Visible = blnHasVScrollbar;
47 barV.Value = intoV.nPos;
48 barV.BringToFront();
49 }
50 else if (control is ListBox)
51 {
52 var lb = control as ListBox;
53 if (intoV.ScrollMax <= 1)
54 {
55 var v = lb.ItemHeight * lb.Items.Count - lb.Height;
56 if (v > 0)
57 barV.Maximum = v;
58 else
59 barV.Maximum = intoV.ScrollMax * lb.ItemHeight;
60 }
61 else
62 {
63 barV.Maximum = intoV.ScrollMax * lb.ItemHeight;
64 }
65 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;
66 barV.Value = intoV.nPos * lb.ItemHeight;
67 barV.BringToFront();
68 }
69 else if (control is ListView)
70 {
71 barV.Maximum = intoV.ScrollMax;
72 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;
73 barV.Value = intoV.nPos;
74 barV.BringToFront();
75 }
76 else if (control is DataGridView)
77 {
78 bool blnHasVScrollbar = false;
79 var dgv = (DataGridView)control;
80 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical)
81 {
82 int _height = dgv.RowTemplate.Height * dgv.Rows.Count;
83 if (dgv.ColumnHeadersVisible)
84 {
85 _height += dgv.ColumnHeadersHeight;
86 }
87 blnHasVScrollbar = _height > dgv.Height;
88 }
89 barV.Maximum = dgv.Rows.Count;
90 barV.Visible = blnHasVScrollbar;
91 barV.Value = dgv.FirstDisplayedScrollingRowIndex; ;
92 barV.BringToFront();
93 }
94 }
95 private void SetHMaxNum(Control control)
96 {
97 if (!m_lstHCache.ContainsKey(control))
98 return;
99 var intoH = ControlHelper.GetHScrollBarInfo(control.Handle);
100 UCHScrollbar barH = m_lstHCache[control];
101 if (control is ScrollableControl)
102 {
103 barH.Maximum = intoH.ScrollMax;
104 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;
105 barH.Value = intoH.nPos;
106 barH.BringToFront();
107
108 //barH.Maximum = (control as ScrollableControl).HorizontalScroll.Maximum;
109 //barH.Value = (control as ScrollableControl).HorizontalScroll.Value;
110 }
111 else if (control is TreeView)
112 {
113 var tv = control as TreeView;
114 barH.Maximum = intoH.ScrollMax;
115 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;
116 barH.Value = intoH.nPos;
117 barH.BringToFront();
118 //barH.Maximum = GetTreeNodeMaxX(control as TreeView);
119 //barH.Value = (control as TreeView).AutoScrollOffset.X;
120 }
121 else if (control is TextBox)
122 {
123 TextBox txt = (TextBox)control;
124 barH.Maximum = intoH.ScrollMax;
125
126 if (txt.ScrollBars == ScrollBars.Both || txt.ScrollBars == ScrollBars.Horizontal)
127 {
128 barH.Visible = true;
129 }
130 else
131 {
132 barH.Visible = false;
133 }
134
135 barH.Value = intoH.nPos;
136 barH.BringToFront();
137 }
138 else if (control is RichTextBox)
139 {
140 bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0;
141
142 barH.Maximum = intoH.ScrollMax;
143 barH.Visible = blnHasHScrollbar;
144 barH.Value = intoH.nPos;
145 barH.BringToFront();
146 }
147 else if (control is ListBox)
148 {
149 var lb = control as ListBox;
150 barH.Maximum = intoH.ScrollMax * lb.ItemHeight;
151 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;
152 barH.Value = intoH.nPos * lb.ItemHeight;
153 barH.BringToFront();
154 }
155 else if (control is ListView)
156 {
157 barH.Maximum = intoH.ScrollMax;
158 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;
159 barH.Value = intoH.nPos;
160 barH.BringToFront();
161 }
162 else if (control is DataGridView)
163 {
164 bool blnHasHScrollbar = false;
165 var dgv = (DataGridView)control;
166 int _width = 0;
167 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)
168 {
169 foreach (DataGridViewColumn com in dgv.Columns)
170 {
171 _width += com.Width;
172 }
173 if (dgv.RowHeadersVisible)
174 {
175 _width += dgv.RowHeadersWidth;
176 }
177 blnHasHScrollbar = _width > dgv.Width;
178 }
179 if (blnHasHScrollbar)
180 barH.Maximum = _width - dgv.Width;
181 barH.Visible = blnHasHScrollbar;
182 barH.Value = dgv.FirstDisplayedScrollingColumnHiddenWidth;
183 barH.BringToFront();
184 }
185 }
位置改变时候修改滚动条
1 private void ResetScrollLocation(object sender)
2 {
3 Control control = (Control)sender;
4 bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0;
5 bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0;
6 if (control is TextBox)
7 {
8 var txt = (TextBox)control;
9 if (txt.ScrollBars == ScrollBars.Both)
10 {
11 blnHasVScrollbar = true;
12 blnHasHScrollbar = true;
13 }
14 else if (txt.ScrollBars == ScrollBars.Vertical)
15 {
16 blnHasVScrollbar = true;
17 blnHasHScrollbar = false;
18 }
19 else if (txt.ScrollBars == ScrollBars.Horizontal)
20 {
21 blnHasVScrollbar = false;
22 blnHasHScrollbar = true;
23 }
24 else
25 {
26 blnHasVScrollbar = false;
27 blnHasHScrollbar = false;
28 }
29 }
30 else if (control is DataGridView)
31 {
32 var dgv = (DataGridView)control;
33 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical)
34 {
35 int _height = dgv.RowTemplate.Height * dgv.Rows.Count;
36 if (dgv.ColumnHeadersVisible)
37 {
38 _height += dgv.ColumnHeadersHeight;
39 }
40 blnHasVScrollbar = _height > dgv.Height;
41 }
42 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)
43 {
44 int _width = 0;
45 foreach (DataGridViewColumn com in dgv.Columns)
46 {
47 _width += com.Width;
48 }
49 if (dgv.RowHeadersVisible)
50 {
51 _width += dgv.RowHeadersWidth;
52 }
53 blnHasHScrollbar = _width > dgv.Width;
54 }
55 }
56 else if (control is ListView)
57 {
58 if (!((ListView)control).Scrollable)
59 {
60 blnHasVScrollbar = false;
61 blnHasHScrollbar = false;
62 }
63 }
64 if (control.Visible)
65 {
66 if (m_lstVCache.ContainsKey(control))
67 {
68 m_lstVCache[control].Location = new System.Drawing.Point(control.Right - m_lstVCache[control].Width, control.Top);
69 if (blnHasHScrollbar)
70 {
71 m_lstVCache[control].Height = control.Height - m_lstHCache[control].Height;
72 }
73 else
74 {
75 m_lstVCache[control].Height = control.Height;
76 }
77 SetVMaxNum(control);
78 }
79
80 if (m_lstHCache.ContainsKey(control))
81 {
82 m_lstHCache[control].Location = new System.Drawing.Point(control.Left, control.Bottom - m_lstHCache[control].Height);
83 //if (blnHasVScrollbar)
84 //{
85 // m_lstHCache[control].Width = control.Width - m_lstVCache[control].Width;
86 //}
87 //else
88 //{
89 m_lstHCache[control].Width = control.Width;
90 //}
91 SetHMaxNum(control);
92 }
93 }
94 }
滑动滚动条的处理滚动
1 void barV_Scroll(object sender, EventArgs e)
2 {
3 UCVScrollbar bar = (UCVScrollbar)sender;
4 if (m_lstVCache.ContainsValue(bar))
5 {
6 Control c = m_lstVCache.FirstOrDefault(p => p.Value == bar).Key;
7
8 //ControlHelper.SetVScrollValue(c.Handle, bar.Value);
9 if (c is ScrollableControl)
10 {
11 (c as ScrollableControl).AutoScrollPosition = new Point((c as ScrollableControl).AutoScrollPosition.X, bar.Value);
12 }
13 else if (c is TreeView)
14 {
15 ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as TreeView).ItemHeight));
16 }
17 else if (c is TextBox)
18 {
19 ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as TextBox).PreferredHeight));
20 }
21 else if (c is RichTextBox)
22 {
23 ControlHelper.SetVScrollValue(c.Handle, bar.Value);
24 }
25 else if (c is ListBox)
26 {
27 ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as ListBox).ItemHeight));
28 }
29 else if (c is ListView)
30 {
31 ControlHelper.SetVScrollValue(c.Handle, bar.Value);
32 }
33 else if (c is DataGridView)
34 {
35 var dgv = (DataGridView)c;
36 if(bar.Value>0)
37 dgv.FirstDisplayedScrollingRowIndex = bar.Value - 1;
38 }
39 }
40 }
41
42 void barH_Scroll(object sender, EventArgs e)
43 {
44 UCHScrollbar bar = (UCHScrollbar)sender;
45 if (m_lstHCache.ContainsValue(bar))
46 {
47 Control c = m_lstHCache.FirstOrDefault(p => p.Value == bar).Key;
48 if (c is ScrollableControl)
49 {
50 (c as ScrollableControl).AutoScrollPosition = new Point(bar.Value, (c as ScrollableControl).AutoScrollPosition.Y);
51 }
52 else if (c is TreeView)
53 {
54 ControlHelper.SetHScrollValue(c.Handle, bar.Value);
55 //TreeView tv = (c as TreeView);
56 //SetTreeViewVScrollLocation(tv, tv.Nodes, bar.Value);
57 }
58 else if (c is TextBox)
59 {
60 ControlHelper.SetHScrollValue(c.Handle, bar.Value);
61 //TextBox txt = (c as TextBox);
62 //SetTextBoxVScrollLocation(txt, bar.Value);
63 }
64 else if (c is RichTextBox)
65 {
66 ControlHelper.SetHScrollValue(c.Handle, bar.Value);
67 }
68 else if (c is ListBox)
69 {
70 ControlHelper.SetHScrollValue(c.Handle, bar.Value);
71 }
72 else if (c is ListView)
73 {
74 ControlHelper.SetHScrollValue(c.Handle, bar.Value);
75 }
76 else if (c is DataGridView)
77 {
78 var dgv = (DataGridView)c;
79 dgv.HorizontalScrollingOffset = bar.Value;
80 }
81 }
82 }
以下是全部代码
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Drawing;
5 using System.Linq;
6 using System.Text;
7 using System.Windows.Forms;
8
9 namespace HZH_Controls.Controls
10 {
11 [ProvideProperty("UserCustomScrollbar", typeof(Control))]
12 public class ScrollbarComponent : Component, IExtenderProvider
13 {
14 public ScrollbarComponent()
15 {
16
17 }
18
19 public ScrollbarComponent(IContainer container)
20 {
21 container.Add(this);
22 }
23
24 Dictionary<Control, bool> m_controlCache = new Dictionary<Control, bool>();
25 public bool CanExtend(object extendee)
26 {
27 if (extendee is ScrollableControl)
28 {
29 ScrollableControl control = (ScrollableControl)extendee;
30 if (control.AutoScroll == true)
31 {
32 return true;
33 }
34 }
35 else if (extendee is TreeView)
36 {
37 TreeView control = (TreeView)extendee;
38 if (control.Scrollable)
39 {
40 return true;
41 }
42 }
43 else if (extendee is TextBox)
44 {
45 TextBox control = (TextBox)extendee;
46 if (control.Multiline && control.ScrollBars != ScrollBars.None)
47 {
48 return true;
49 }
50 }
51 else if (extendee is RichTextBox)
52 {
53 return true;
54 }
55 else if (extendee is ListBox)
56 {
57 return true;
58 }
59 //else if (extendee is ListView)
60 //{
61 // return true;
62 //}
63 else if (extendee is DataGridView)
64 {
65 return true;
66 }
67 return false;
68 }
69
70 [Browsable(true), Category("自定义属性"), Description("是否使用自定义滚动条"), DisplayName("UserCustomScrollbar"), Localizable(true)]
71 public bool GetUserCustomScrollbar(Control control)
72 {
73 if (m_controlCache.ContainsKey(control))
74 return m_controlCache[control];
75 return true;
76 }
77
78 public void SetUserCustomScrollbar(Control control, bool blnUserCustomScrollbar)
79 {
80 m_controlCache[control] = blnUserCustomScrollbar;
81 if (!blnUserCustomScrollbar)
82 return;
83
84 if (control is TreeView)
85 {
86 TreeView tv = (TreeView)control;
87 //tv.MouseWheel += tv_MouseWheel;
88 //tv.AfterSelect += tv_AfterSelect;
89 tv.AfterExpand += tv_AfterExpand;
90 tv.AfterCollapse += tv_AfterCollapse;
91 }
92 else if (control is TextBox)
93 {
94 TextBox txt = (TextBox)control;
95 //txt.MouseWheel += txt_MouseWheel;
96 txt.TextChanged += txt_TextChanged;
97 txt.KeyDown += txt_KeyDown;
98 }
99 else if (control is RichTextBox)
100 {
101 RichTextBox txt = (RichTextBox)control;
102 //txt.MouseWheel += txt_MouseWheel;
103 txt.TextChanged += txt_TextChanged;
104 txt.KeyDown += txt_KeyDown;
105 }
106 else if (control is ListBox)
107 {
108 ListBox lb = (ListBox)control;
109 lb.DataSourceChanged += Lb_DataSourceChanged;
110 lb.SelectedIndexChanged += Lb_SelectedIndexChanged;
111 }
112 //else if (control is ListView)
113 //{
114 // ListView lv = (ListView)control;
115
116 //}
117 else if (control is DataGridView)
118 {
119 DataGridView dgv = (DataGridView)control;
120 dgv.DataSourceChanged += dgv_DataSourceChanged;
121 dgv.RowsAdded += dgv_RowsAdded;
122 dgv.RowsRemoved += dgv_RowsRemoved;
123 dgv.Scroll += dgv_Scroll;
124 }
125
126 control.VisibleChanged += control_VisibleChanged;
127 control.SizeChanged += control_SizeChanged;
128 control.LocationChanged += control_LocationChanged;
129 control.Disposed += control_Disposed;
130 control.MouseWheel += Control_MouseWheel;
131 control_SizeChanged(control, null);
132 }
133
134 void dgv_Scroll(object sender, ScrollEventArgs e)
135 {
136 if (e.NewValue == e.OldValue)
137 return;
138 DataGridView dgv = (DataGridView)sender;
139 if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)
140 {
141 if (m_lstHCache.ContainsKey(dgv))
142 {
143 m_lstHCache[dgv].Value = e.NewValue;
144 }
145 }
146 else if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
147 {
148 if (m_lstVCache.ContainsKey(dgv))
149 {
150 m_lstVCache[dgv].Value = e.NewValue;
151 }
152 }
153 }
154
155 void dgv_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
156 {
157 Control control = sender as Control;
158 control_SizeChanged(control, null);
159 }
160
161 void dgv_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
162 {
163 Control control = sender as Control;
164 control_SizeChanged(control, null);
165 }
166
167 void dgv_DataSourceChanged(object sender, EventArgs e)
168 {
169 Control control = sender as Control;
170 control_SizeChanged(control, null);
171 }
172
173 private void Lb_SelectedIndexChanged(object sender, EventArgs e)
174 {
175 Control c = sender as Control;
176 SetVMaxNum(c);
177 }
178
179 private void Lb_DataSourceChanged(object sender, EventArgs e)
180 {
181 Control c = sender as Control;
182 control_SizeChanged(c, null);
183 }
184
185 private void Control_MouseWheel(object sender, MouseEventArgs e)
186 {
187 Control c = (Control)sender;
188 if (m_lstVCache.ContainsKey(c))
189 {
190 if (e.Delta > 5)
191 {
192 ControlHelper.ScrollUp(c.Handle);
193 }
194 else if (e.Delta < -5)
195 {
196 ControlHelper.ScrollDown(c.Handle);
197 }
198
199 SetVMaxNum(c);
200 }
201 else if (m_lstHCache.ContainsKey(c))
202 {
203 if (e.Delta > 5)
204 {
205 ControlHelper.ScrollLeft(c.Handle);
206 }
207 else if (e.Delta < -5)
208 {
209 ControlHelper.ScrollRight(c.Handle);
210 }
211
212 SetHMaxNum(c);
213 }
214 }
215
216 void control_Disposed(object sender, EventArgs e)
217 {
218 Control control = (Control)sender;
219 if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null)
220 {
221 m_lstVCache[control].Parent.Controls.Remove(m_lstVCache[control]);
222 m_lstVCache.Remove(control);
223 }
224 }
225
226 void control_LocationChanged(object sender, EventArgs e)
227 {
228 ResetScrollLocation(sender);
229 }
230
231 void control_SizeChanged(object sender, EventArgs e)
232 {
233 if (ControlHelper.IsDesignMode())
234 {
235 return;
236 }
237 else
238 {
239 var control = sender as Control;
240
241 bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0;
242 bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0;
243 if (control is TextBox)
244 {
245 var txt = (TextBox)control;
246 if (txt.ScrollBars == ScrollBars.Both)
247 {
248 blnHasVScrollbar = true;
249 blnHasHScrollbar = true;
250 }
251 else if (txt.ScrollBars == ScrollBars.Vertical)
252 {
253 blnHasVScrollbar = true;
254 blnHasHScrollbar = false;
255 }
256 else if (txt.ScrollBars == ScrollBars.Horizontal)
257 {
258 blnHasVScrollbar = false;
259 blnHasHScrollbar = true;
260 }
261 else
262 {
263 blnHasVScrollbar = false;
264 blnHasHScrollbar = false;
265 }
266 }
267 else if (control is DataGridView)
268 {
269 var dgv = (DataGridView)control;
270 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical)
271 {
272 int _height = dgv.RowTemplate.Height * dgv.Rows.Count;
273 if (dgv.ColumnHeadersVisible)
274 {
275 _height += dgv.ColumnHeadersHeight;
276 }
277 blnHasVScrollbar = _height > dgv.Height;
278 }
279 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)
280 {
281 int _width = 0;
282 foreach (DataGridViewColumn com in dgv.Columns)
283 {
284 _width += com.Width;
285 }
286 if (dgv.RowHeadersVisible)
287 {
288 _width += dgv.RowHeadersWidth;
289 }
290 blnHasHScrollbar = _width > dgv.Width;
291 }
292 }
293 else if (control is ListView)
294 {
295 if (!((ListView)control).Scrollable)
296 {
297 blnHasVScrollbar = false;
298 blnHasHScrollbar = false;
299 }
300 }
301 if (blnHasVScrollbar)
302 {
303 if (!m_lstVCache.ContainsKey(control))
304 {
305 if (control.Parent != null)
306 {
307 UCVScrollbar barV = new UCVScrollbar();
308 barV.SmallChange = 5;
309 barV.Width = SystemInformation.VerticalScrollBarWidth + 1;
310 barV.Scroll += barV_Scroll;
311 m_lstVCache[control] = barV;
312 if (blnHasHScrollbar)
313 {
314 barV.Height = control.Height - barV.Width;
315 }
316 else
317 {
318 barV.Height = control.Height;
319 }
320 SetVMaxNum(control);
321 barV.Location = new System.Drawing.Point(control.Right - barV.Width, control.Top);
322 control.Parent.Controls.Add(barV);
323 int intControlIndex = control.Parent.Controls.GetChildIndex(control);
324 control.Parent.Controls.SetChildIndex(barV, intControlIndex);
325 }
326 }
327 else
328 {
329 if (blnHasHScrollbar)
330 {
331 m_lstVCache[control].Height = control.Height - m_lstVCache[control].Width;
332 }
333 else
334 {
335 m_lstVCache[control].Height = control.Height;
336 }
337 SetVMaxNum(control);
338 }
339 }
340 else
341 {
342 if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null)
343 {
344 m_lstVCache[control].Visible = false;
345 }
346 }
347
348 if (blnHasHScrollbar)
349 {
350 if (!m_lstHCache.ContainsKey(control))
351 {
352 if (control.Parent != null)
353 {
354 UCHScrollbar barH = new UCHScrollbar();
355 barH.Height = SystemInformation.HorizontalScrollBarHeight + 1;
356 barH.SmallChange = 5;
357
358 barH.Scroll += barH_Scroll;
359 m_lstHCache[control] = barH;
360 if (blnHasHScrollbar)
361 {
362 barH.Width = control.Width - barH.Height;
363 }
364 else
365 {
366 barH.Width = control.Width;
367 }
368 SetHMaxNum(control);
369 barH.Location = new System.Drawing.Point(control.Left, control.Bottom - barH.Height);
370 control.Parent.Controls.Add(barH);
371 int intControlIndex = control.Parent.Controls.GetChildIndex(control);
372 control.Parent.Controls.SetChildIndex(barH, intControlIndex);
373 }
374 }
375 else
376 {
377 if (blnHasHScrollbar)
378 {
379 m_lstHCache[control].Width = control.Width - m_lstHCache[control].Height;
380 }
381 else
382 {
383 m_lstHCache[control].Width = control.Width;
384 }
385 SetHMaxNum(control);
386 }
387 }
388 else
389 {
390 if (m_lstHCache.ContainsKey(control))
391 {
392 if (m_lstHCache[control].Visible && m_lstHCache[control].Parent != null)
393 {
394 m_lstHCache[control].Visible = false;
395 }
396 }
397 }
398 }
399 ResetScrollLocation(sender);
400 }
401
402
403 private void SetVMaxNum(Control control)
404 {
405 if (!m_lstVCache.ContainsKey(control))
406 return;
407 var intoV = ControlHelper.GetVScrollBarInfo(control.Handle);
408 UCVScrollbar barV = m_lstVCache[control];
409 if (control is ScrollableControl)
410 {
411 barV.Maximum = intoV.ScrollMax;
412 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;
413 barV.Value = intoV.nPos;
414 barV.BringToFront();
415 // barV.Maximum = (control as ScrollableControl).VerticalScroll.Maximum;
416 // barV.Value = (control as ScrollableControl).VerticalScroll.Value;
417 }
418 else if (control is TreeView)
419 {
420 var tv = control as TreeView;
421 barV.Maximum = intoV.ScrollMax * tv.ItemHeight;
422 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;
423 barV.Value = intoV.nPos * tv.ItemHeight;
424 barV.BringToFront();
425
426 //barV.Maximum = GetTreeNodeMaxY(control as TreeView) - control.Height;
427 //barV.Value = (control as TreeView).AutoScrollOffset.Y;
428 }
429 else if (control is TextBox)
430 {
431 TextBox txt = (TextBox)control;
432 barV.Maximum = intoV.ScrollMax * txt.PreferredHeight;
433 if (txt.ScrollBars == ScrollBars.Both || txt.ScrollBars == ScrollBars.Vertical)
434 {
435 barV.Visible = true;
436 }
437 else
438 {
439 barV.Visible = false;
440 }
441 barV.Value = intoV.nPos * txt.PreferredHeight;
442 barV.BringToFront();
443 }
444 else if (control is RichTextBox)
445 {
446 bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0;
447 barV.Maximum = intoV.ScrollMax;
448 barV.Visible = blnHasVScrollbar;
449 barV.Value = intoV.nPos;
450 barV.BringToFront();
451 }
452 else if (control is ListBox)
453 {
454 var lb = control as ListBox;
455 if (intoV.ScrollMax <= 1)
456 {
457 var v = lb.ItemHeight * lb.Items.Count - lb.Height;
458 if (v > 0)
459 barV.Maximum = v;
460 else
461 barV.Maximum = intoV.ScrollMax * lb.ItemHeight;
462 }
463 else
464 {
465 barV.Maximum = intoV.ScrollMax * lb.ItemHeight;
466 }
467 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;
468 barV.Value = intoV.nPos * lb.ItemHeight;
469 barV.BringToFront();
470 }
471 else if (control is ListView)
472 {
473 barV.Maximum = intoV.ScrollMax;
474 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;
475 barV.Value = intoV.nPos;
476 barV.BringToFront();
477 }
478 else if (control is DataGridView)
479 {
480 bool blnHasVScrollbar = false;
481 var dgv = (DataGridView)control;
482 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical)
483 {
484 int _height = dgv.RowTemplate.Height * dgv.Rows.Count;
485 if (dgv.ColumnHeadersVisible)
486 {
487 _height += dgv.ColumnHeadersHeight;
488 }
489 blnHasVScrollbar = _height > dgv.Height;
490 }
491 barV.Maximum = dgv.Rows.Count;
492 barV.Visible = blnHasVScrollbar;
493 barV.Value = dgv.FirstDisplayedScrollingRowIndex; ;
494 barV.BringToFront();
495 }
496 }
497 private void SetHMaxNum(Control control)
498 {
499 if (!m_lstHCache.ContainsKey(control))
500 return;
501 var intoH = ControlHelper.GetHScrollBarInfo(control.Handle);
502 UCHScrollbar barH = m_lstHCache[control];
503 if (control is ScrollableControl)
504 {
505 barH.Maximum = intoH.ScrollMax;
506 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;
507 barH.Value = intoH.nPos;
508 barH.BringToFront();
509
510 //barH.Maximum = (control as ScrollableControl).HorizontalScroll.Maximum;
511 //barH.Value = (control as ScrollableControl).HorizontalScroll.Value;
512 }
513 else if (control is TreeView)
514 {
515 var tv = control as TreeView;
516 barH.Maximum = intoH.ScrollMax;
517 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;
518 barH.Value = intoH.nPos;
519 barH.BringToFront();
520 //barH.Maximum = GetTreeNodeMaxX(control as TreeView);
521 //barH.Value = (control as TreeView).AutoScrollOffset.X;
522 }
523 else if (control is TextBox)
524 {
525 TextBox txt = (TextBox)control;
526 barH.Maximum = intoH.ScrollMax;
527
528 if (txt.ScrollBars == ScrollBars.Both || txt.ScrollBars == ScrollBars.Horizontal)
529 {
530 barH.Visible = true;
531 }
532 else
533 {
534 barH.Visible = false;
535 }
536
537 barH.Value = intoH.nPos;
538 barH.BringToFront();
539 }
540 else if (control is RichTextBox)
541 {
542 bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0;
543
544 barH.Maximum = intoH.ScrollMax;
545 barH.Visible = blnHasHScrollbar;
546 barH.Value = intoH.nPos;
547 barH.BringToFront();
548 }
549 else if (control is ListBox)
550 {
551 var lb = control as ListBox;
552 barH.Maximum = intoH.ScrollMax * lb.ItemHeight;
553 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;
554 barH.Value = intoH.nPos * lb.ItemHeight;
555 barH.BringToFront();
556 }
557 else if (control is ListView)
558 {
559 barH.Maximum = intoH.ScrollMax;
560 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;
561 barH.Value = intoH.nPos;
562 barH.BringToFront();
563 }
564 else if (control is DataGridView)
565 {
566 bool blnHasHScrollbar = false;
567 var dgv = (DataGridView)control;
568 int _width = 0;
569 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)
570 {
571 foreach (DataGridViewColumn com in dgv.Columns)
572 {
573 _width += com.Width;
574 }
575 if (dgv.RowHeadersVisible)
576 {
577 _width += dgv.RowHeadersWidth;
578 }
579 blnHasHScrollbar = _width > dgv.Width;
580 }
581 if (blnHasHScrollbar)
582 barH.Maximum = _width - dgv.Width;
583 barH.Visible = blnHasHScrollbar;
584 barH.Value = dgv.FirstDisplayedScrollingColumnHiddenWidth;
585 barH.BringToFront();
586 }
587 }
588 /// <summary>
589 /// Resets the v scroll location.
590 /// </summary>
591 /// <param name="sender">The sender.</param>
592 private void ResetScrollLocation(object sender)
593 {
594 Control control = (Control)sender;
595 bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0;
596 bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0;
597 if (control is TextBox)
598 {
599 var txt = (TextBox)control;
600 if (txt.ScrollBars == ScrollBars.Both)
601 {
602 blnHasVScrollbar = true;
603 blnHasHScrollbar = true;
604 }
605 else if (txt.ScrollBars == ScrollBars.Vertical)
606 {
607 blnHasVScrollbar = true;
608 blnHasHScrollbar = false;
609 }
610 else if (txt.ScrollBars == ScrollBars.Horizontal)
611 {
612 blnHasVScrollbar = false;
613 blnHasHScrollbar = true;
614 }
615 else
616 {
617 blnHasVScrollbar = false;
618 blnHasHScrollbar = false;
619 }
620 }
621 else if (control is DataGridView)
622 {
623 var dgv = (DataGridView)control;
624 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical)
625 {
626 int _height = dgv.RowTemplate.Height * dgv.Rows.Count;
627 if (dgv.ColumnHeadersVisible)
628 {
629 _height += dgv.ColumnHeadersHeight;
630 }
631 blnHasVScrollbar = _height > dgv.Height;
632 }
633 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)
634 {
635 int _width = 0;
636 foreach (DataGridViewColumn com in dgv.Columns)
637 {
638 _width += com.Width;
639 }
640 if (dgv.RowHeadersVisible)
641 {
642 _width += dgv.RowHeadersWidth;
643 }
644 blnHasHScrollbar = _width > dgv.Width;
645 }
646 }
647 else if (control is ListView)
648 {
649 if (!((ListView)control).Scrollable)
650 {
651 blnHasVScrollbar = false;
652 blnHasHScrollbar = false;
653 }
654 }
655 if (control.Visible)
656 {
657 if (m_lstVCache.ContainsKey(control))
658 {
659 m_lstVCache[control].Location = new System.Drawing.Point(control.Right - m_lstVCache[control].Width, control.Top);
660 if (blnHasHScrollbar)
661 {
662 m_lstVCache[control].Height = control.Height - m_lstHCache[control].Height;
663 }
664 else
665 {
666 m_lstVCache[control].Height = control.Height;
667 }
668 SetVMaxNum(control);
669 }
670
671 if (m_lstHCache.ContainsKey(control))
672 {
673 m_lstHCache[control].Location = new System.Drawing.Point(control.Left, control.Bottom - m_lstHCache[control].Height);
674 //if (blnHasVScrollbar)
675 //{
676 // m_lstHCache[control].Width = control.Width - m_lstVCache[control].Width;
677 //}
678 //else
679 //{
680 m_lstHCache[control].Width = control.Width;
681 //}
682 SetHMaxNum(control);
683 }
684 }
685 }
686
687 /// <summary>
688 /// Handles the VisibleChanged event of the control control.
689 /// </summary>
690 /// <param name="sender">The source of the event.</param>
691 /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
692 void control_VisibleChanged(object sender, EventArgs e)
693 {
694 Control control = (Control)sender;
695
696 if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null)
697 {
698 m_lstVCache[control].Visible = control.Visible;
699 }
700
701 if (m_lstHCache.ContainsKey(control) && m_lstHCache[control].Parent != null)
702 {
703 m_lstHCache[control].Visible = control.Visible;
704 }
705 if (control.Visible)
706 {
707 control_SizeChanged(control, null);
708 }
709 }
710
711 private const int HSCROLL = 0x100000;
712 private const int VSCROLL = 0x200000;
713 private const int STYLE = -16;
714
715 private Dictionary<Control, UCVScrollbar> m_lstVCache = new Dictionary<Control, UCVScrollbar>();
716 private Dictionary<Control, UCHScrollbar> m_lstHCache = new Dictionary<Control, UCHScrollbar>();
717
718 void barV_Scroll(object sender, EventArgs e)
719 {
720 UCVScrollbar bar = (UCVScrollbar)sender;
721 if (m_lstVCache.ContainsValue(bar))
722 {
723 Control c = m_lstVCache.FirstOrDefault(p => p.Value == bar).Key;
724
725 //ControlHelper.SetVScrollValue(c.Handle, bar.Value);
726 if (c is ScrollableControl)
727 {
728 (c as ScrollableControl).AutoScrollPosition = new Point((c as ScrollableControl).AutoScrollPosition.X, bar.Value);
729 }
730 else if (c is TreeView)
731 {
732 ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as TreeView).ItemHeight));
733 }
734 else if (c is TextBox)
735 {
736 ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as TextBox).PreferredHeight));
737 }
738 else if (c is RichTextBox)
739 {
740 ControlHelper.SetVScrollValue(c.Handle, bar.Value);
741 }
742 else if (c is ListBox)
743 {
744 ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as ListBox).ItemHeight));
745 }
746 else if (c is ListView)
747 {
748 ControlHelper.SetVScrollValue(c.Handle, bar.Value);
749 }
750 else if (c is DataGridView)
751 {
752 var dgv = (DataGridView)c;
753 if(bar.Value>0)
754 dgv.FirstDisplayedScrollingRowIndex = bar.Value - 1;
755 }
756 }
757 }
758
759 void barH_Scroll(object sender, EventArgs e)
760 {
761 UCHScrollbar bar = (UCHScrollbar)sender;
762 if (m_lstHCache.ContainsValue(bar))
763 {
764 Control c = m_lstHCache.FirstOrDefault(p => p.Value == bar).Key;
765 if (c is ScrollableControl)
766 {
767 (c as ScrollableControl).AutoScrollPosition = new Point(bar.Value, (c as ScrollableControl).AutoScrollPosition.Y);
768 }
769 else if (c is TreeView)
770 {
771 ControlHelper.SetHScrollValue(c.Handle, bar.Value);
772 //TreeView tv = (c as TreeView);
773 //SetTreeViewVScrollLocation(tv, tv.Nodes, bar.Value);
774 }
775 else if (c is TextBox)
776 {
777 ControlHelper.SetHScrollValue(c.Handle, bar.Value);
778 //TextBox txt = (c as TextBox);
779 //SetTextBoxVScrollLocation(txt, bar.Value);
780 }
781 else if (c is RichTextBox)
782 {
783 ControlHelper.SetHScrollValue(c.Handle, bar.Value);
784 }
785 else if (c is ListBox)
786 {
787 ControlHelper.SetHScrollValue(c.Handle, bar.Value);
788 }
789 else if (c is ListView)
790 {
791 ControlHelper.SetHScrollValue(c.Handle, bar.Value);
792 }
793 else if (c is DataGridView)
794 {
795 var dgv = (DataGridView)c;
796 dgv.HorizontalScrollingOffset = bar.Value;
797 }
798 }
799 }
800
801 #region Treeview处理 English:Treeview\u5904\u7406
802 void tv_AfterCollapse(object sender, TreeViewEventArgs e)
803 {
804 control_SizeChanged(sender as Control, null);
805 }
806
807 void tv_AfterExpand(object sender, TreeViewEventArgs e)
808 {
809 control_SizeChanged(sender as Control, null);
810 }
811
812 #endregion
813
814 #region TextBox处理 English:TextBox Processing
815
816 void txt_TextChanged(object sender, EventArgs e)
817 {
818 Control txt = sender as Control;
819 control_SizeChanged(txt, null);
820 }
821
822 void txt_KeyDown(object sender, KeyEventArgs e)
823 {
824 Control txt = sender as Control;
825 control_SizeChanged(txt, null);
826 }
827 #endregion
828 }
829 }
最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧
来源:oschina
链接:https://my.oschina.net/u/4385718/blog/4413023