zoukankan      html  css  js  c++  java
  • (八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)

    官网

    http://www.hzhcontrols.com/

    前提

    入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

    如果觉得写的还行,请点个 star 支持一下吧

    欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

    来都来了,点个【推荐】再走吧,谢谢

    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:Treeviewu5904u7406
    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 }
    View Code

    最后的话

    如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

  • 相关阅读:
    汉语-词语:慧根
    汉语-词语:悟性
    汉语-汉字:耑
    汉语-汉字:羣
    汉语-词语:觉察
    汉语-词语:醒悟
    汉语-词语:觉悟
    Redhat 5禁止IPv6
    从缓存行出发理解volatile变量、伪共享False sharing、disruptor
    【故障处理141119】一次数据库不繁忙时一条sql语句2个运行计划导致业务超时的故障处理
  • 原文地址:https://www.cnblogs.com/bfyx/p/13224562.html
Copyright © 2011-2022 走看看