官网
欢迎前来交流探讨: 企鹅群568015492
来都来了,点个【推荐】再走吧,谢谢
NuGet
Install-Package HZH_Controls
目录
准备工作
这个是在前面滚动条上完善的,加入了对常用控件滚动条的美化,实现逻辑是添加一个滚动条控件,然后覆盖在滚动条上面,然后实现联动
绘制滚动条的工作,你可以参考
(六十九)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 else104 {105 m_lstVCache[control].Height = control.Height;106 }107 SetVMaxNum(control);108 }109 }110 else111 {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 else135 {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 else146 {147 if (blnHasHScrollbar)148 {149 m_lstHCache[control].Width = control.Width - m_lstHCache[control].Height;150 }151 else152 {153 m_lstHCache[control].Width = control.Width;154 }155 SetHMaxNum(control);156 }157 }158 else159 {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 else131 {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 else25 {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 else74 {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 //else88 //{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 else238 {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 else262 {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 else317 {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 else328 {329 if (blnHasHScrollbar)330 {331 m_lstVCache[control].Height = control.Height - m_lstVCache[control].Width;332 }333 else334 {335 m_lstVCache[control].Height = control.Height;336 }337 SetVMaxNum(control);338 }339 }340 else341 {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 else365 {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 else376 {377 if (blnHasHScrollbar)378 {379 m_lstHCache[control].Width = control.Width - m_lstHCache[control].Height;380 }381 else382 {383 m_lstHCache[control].Width = control.Width;384 }385 SetHMaxNum(control);386 }387 }388 else389 {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 else438 {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 else461 barV.Maximum = intoV.ScrollMax * lb.ItemHeight;462 }463 else464 {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 else533 {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 else616 {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 else665 {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 //else679 //{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\u7406802 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
没有评论:
发表评论