123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- // ***********************************************************************
- // Assembly : HZH_Controls
- // Created : 2019-09-19
- //
- // ***********************************************************************
- // <copyright file="UCVScrollbar.cs">
- // Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com
- // </copyright>
- //
- // Blog: https://www.cnblogs.com/bfyx
- // GitHub:https://github.com/kwwwvagaa/NetWinformControl
- // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
- //
- // If you use this code, please keep this note.
- // ***********************************************************************
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Text;
- using System.Windows.Forms;
- using System.Windows.Forms.Design;
- using System.Diagnostics;
- namespace HZH_Controls.Controls
- {
- /// <summary>
- /// Class UCVScrollbar.
- /// Implements the <see cref="HZH_Controls.Controls.UCControlBase" />
- /// </summary>
- /// <seealso cref="HZH_Controls.Controls.UCControlBase" />
- [Designer(typeof(ScrollbarControlDesigner))]
- [DefaultEvent("Scroll")]
- public class UCVScrollbar : UCControlBase
- {
- /// <summary>
- /// The mo large change
- /// </summary>
- protected int moLargeChange = 10;
- /// <summary>
- /// The mo small change
- /// </summary>
- protected int moSmallChange = 1;
- /// <summary>
- /// The mo minimum
- /// </summary>
- protected int moMinimum = 0;
- /// <summary>
- /// The mo maximum
- /// </summary>
- protected int moMaximum = 100;
- /// <summary>
- /// The mo value
- /// </summary>
- protected int moValue = 0;
- /// <summary>
- /// The n click point
- /// </summary>
- private int nClickPoint;
- /// <summary>
- /// The mo thumb top
- /// </summary>
- protected int moThumbTop = 0;
- /// <summary>
- /// The mo automatic size
- /// </summary>
- protected bool moAutoSize = false;
- /// <summary>
- /// The mo thumb down
- /// </summary>
- private bool moThumbMouseDown = false;
- /// <summary>
- /// The mo thumb dragging
- /// </summary>
- private bool moThumbMouseDragging = false;
- /// <summary>
- /// Occurs when [scroll].
- /// </summary>
- public new event EventHandler Scroll = null;
- /// <summary>
- /// Occurs when [value changed].
- /// </summary>
- public event EventHandler ValueChanged = null;
- /// <summary>
- /// The BTN height
- /// </summary>
- private int btnHeight = 18;
- /// <summary>
- /// The m int thumb minimum height
- /// </summary>
- private int m_intThumbMinHeight = 15;
- /// <summary>
- /// Gets or sets the height of the BTN.
- /// </summary>
- /// <value>The height of the BTN.</value>
- public int BtnHeight
- {
- get { return btnHeight; }
- set { btnHeight = value; }
- }
- /// <summary>
- /// Gets or sets the large change.
- /// </summary>
- /// <value>The large change.</value>
- [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("LargeChange")]
- public int LargeChange
- {
- get { return moLargeChange; }
- set
- {
- moLargeChange = value;
- Invalidate();
- }
- }
- /// <summary>
- /// Gets or sets the small change.
- /// </summary>
- /// <value>The small change.</value>
- [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("SmallChange")]
- public int SmallChange
- {
- get { return moSmallChange; }
- set
- {
- moSmallChange = value;
- Invalidate();
- }
- }
- /// <summary>
- /// Gets or sets the minimum.
- /// </summary>
- /// <value>The minimum.</value>
- [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("Minimum")]
- public int Minimum
- {
- get { return moMinimum; }
- set
- {
- moMinimum = value;
- Invalidate();
- }
- }
- /// <summary>
- /// Gets or sets the maximum.
- /// </summary>
- /// <value>The maximum.</value>
- [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("Maximum")]
- public int Maximum
- {
- get { return moMaximum; }
- set
- {
- moMaximum = value;
- Invalidate();
- }
- }
- /// <summary>
- /// Gets or sets the value.
- /// </summary>
- /// <value>The value.</value>
- [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("Value")]
- public int Value
- {
- get { return moValue; }
- set
- {
- moValue = value;
- int nTrackHeight = (this.Height - btnHeight * 2);
- float fThumbHeight = ((float)LargeChange / (float)Maximum) * nTrackHeight;
- int nThumbHeight = (int)fThumbHeight;
- if (nThumbHeight > nTrackHeight)
- {
- nThumbHeight = nTrackHeight;
- fThumbHeight = nTrackHeight;
- }
- if (nThumbHeight < m_intThumbMinHeight)
- {
- nThumbHeight = m_intThumbMinHeight;
- fThumbHeight = m_intThumbMinHeight;
- }
- //figure out value
- int nPixelRange = nTrackHeight - nThumbHeight;
- int nRealRange = (Maximum - Minimum) - LargeChange;
- float fPerc = 0.0f;
- if (nRealRange != 0)
- {
- fPerc = (float)moValue / (float)nRealRange;
- }
- float fTop = fPerc * nPixelRange;
- moThumbTop = (int)fTop;
- Invalidate();
- }
- }
- /// <summary>
- /// Gets or sets a value indicating whether [automatic size].
- /// </summary>
- /// <value><c>true</c> if [automatic size]; otherwise, <c>false</c>.</value>
- public override bool AutoSize
- {
- get
- {
- return base.AutoSize;
- }
- set
- {
- base.AutoSize = value;
- if (base.AutoSize)
- {
- this.Width = 15;
- }
- }
- }
- /// <summary>
- /// The thumb color
- /// </summary>
- private Color thumbColor = Color.FromArgb(255, 77, 58);
- /// <summary>
- /// Gets or sets the color of the thumb.
- /// </summary>
- /// <value>The color of the thumb.</value>
- public Color ThumbColor
- {
- get { return thumbColor; }
- set { thumbColor = value; }
- }
- /// <summary>
- /// Initializes a new instance of the <see cref="UCVScrollbar"/> class.
- /// </summary>
- public UCVScrollbar()
- {
- InitializeComponent();
- ConerRadius = 2;
- FillColor = Color.FromArgb(239, 239, 239);
- IsShowRect = false;
- IsRadius = true;
- this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
- this.SetStyle(ControlStyles.DoubleBuffer, true);
- this.SetStyle(ControlStyles.ResizeRedraw, true);
- this.SetStyle(ControlStyles.Selectable, true);
- this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
- this.SetStyle(ControlStyles.UserPaint, true);
- }
- /// <summary>
- /// Initializes the component.
- /// </summary>
- private void InitializeComponent()
- {
- this.SuspendLayout();
- //
- // UCVScrollbar
- //
- this.MinimumSize = new System.Drawing.Size(10, 0);
- this.Name = "UCVScrollbar";
- this.Size = new System.Drawing.Size(18, 150);
- this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.CustomScrollbar_MouseDown);
- this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.CustomScrollbar_MouseMove);
- this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.CustomScrollbar_MouseUp);
- this.ResumeLayout(false);
- }
- /// <summary>
- /// 引发 <see cref="E:System.Windows.Forms.Control.Paint" /> 事件。
- /// </summary>
- /// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.PaintEventArgs" />。</param>
- protected override void OnPaint(PaintEventArgs e)
- {
- base.OnPaint(e);
- e.Graphics.SetGDIHigh();
- //draw thumb
- int nTrackHeight = (this.Height - btnHeight * 2);
- float fThumbHeight = ((float)LargeChange / (float)Maximum) * nTrackHeight;
- int nThumbHeight = (int)fThumbHeight;
- if (nThumbHeight > nTrackHeight)
- {
- nThumbHeight = nTrackHeight;
- fThumbHeight = nTrackHeight;
- }
- if (nThumbHeight < m_intThumbMinHeight)
- {
- nThumbHeight = m_intThumbMinHeight;
- fThumbHeight = m_intThumbMinHeight;
- }
- int nTop = moThumbTop;
- nTop += btnHeight;
- e.Graphics.FillPath(new SolidBrush(thumbColor), new Rectangle(1, nTop, this.Width - 3, nThumbHeight).CreateRoundedRectanglePath(this.ConerRadius));
- ControlHelper.PaintTriangle(e.Graphics, new SolidBrush(thumbColor), new Point(this.Width / 2, btnHeight - Math.Min(5, this.Width / 2)), Math.Min(5, this.Width / 2), GraphDirection.Upward);
- ControlHelper.PaintTriangle(e.Graphics, new SolidBrush(thumbColor), new Point(this.Width / 2, this.Height - (btnHeight - Math.Min(5, this.Width / 2))), Math.Min(5, this.Width / 2), GraphDirection.Downward);
- }
-
- /// <summary>
- /// Handles the MouseDown event of the CustomScrollbar control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="MouseEventArgs"/> instance containing the event data.</param>
- private void CustomScrollbar_MouseDown(object sender, MouseEventArgs e)
- {
- Point ptPoint = this.PointToClient(Cursor.Position);
- int nTrackHeight = (this.Height - btnHeight * 2);
- float fThumbHeight = ((float)LargeChange / (float)Maximum) * nTrackHeight;
- int nThumbHeight = (int)fThumbHeight;
- if (nThumbHeight > nTrackHeight)
- {
- nThumbHeight = nTrackHeight;
- fThumbHeight = nTrackHeight;
- }
- if (nThumbHeight < m_intThumbMinHeight)
- {
- nThumbHeight = m_intThumbMinHeight;
- fThumbHeight = m_intThumbMinHeight;
- }
- int nTop = moThumbTop;
- nTop += btnHeight;
- Rectangle thumbrect = new Rectangle(new Point(1, nTop), new Size(this.Width - 2, nThumbHeight));
- if (thumbrect.Contains(ptPoint))
- {
- //hit the thumb
- nClickPoint = (ptPoint.Y - nTop);
- //MessageBox.Show(Convert.ToString((ptPoint.Y - nTop)));
- this.moThumbMouseDown = true;
- }
- else
- {
- Rectangle uparrowrect = new Rectangle(new Point(1, 0), new Size(this.Width, btnHeight));
- if (uparrowrect.Contains(ptPoint))
- {
- int nRealRange = (Maximum - Minimum) - LargeChange;
- int nPixelRange = (nTrackHeight - nThumbHeight);
- if (nRealRange > 0)
- {
- if (nPixelRange > 0)
- {
- if ((moThumbTop - SmallChange) < 0)
- moThumbTop = 0;
- else
- moThumbTop -= SmallChange;
- //figure out value
- float fPerc = (float)moThumbTop / (float)nPixelRange;
- float fValue = fPerc * (Maximum - LargeChange);
- moValue = (int)fValue;
- if (ValueChanged != null)
- ValueChanged(this, new EventArgs());
- if (Scroll != null)
- Scroll(this, new EventArgs());
- Invalidate();
- }
- }
- }
- else
- {
- Rectangle downarrowrect = new Rectangle(new Point(1, btnHeight + nTrackHeight), new Size(this.Width, btnHeight));
- if (downarrowrect.Contains(ptPoint))
- {
- int nRealRange = (Maximum - Minimum) - LargeChange;
- int nPixelRange = (nTrackHeight - nThumbHeight);
- if (nRealRange > 0)
- {
- if (nPixelRange > 0)
- {
- if ((moThumbTop + SmallChange) > nPixelRange)
- moThumbTop = nPixelRange;
- else
- moThumbTop += SmallChange;
- //figure out value
- float fPerc = (float)moThumbTop / (float)nPixelRange;
- float fValue = fPerc * (Maximum - LargeChange);
- moValue = (int)fValue;
- if (ValueChanged != null)
- ValueChanged(this, new EventArgs());
- if (Scroll != null)
- Scroll(this, new EventArgs());
- Invalidate();
- }
- }
- }
- }
- }
-
- }
- /// <summary>
- /// Handles the MouseUp event of the CustomScrollbar control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="MouseEventArgs"/> instance containing the event data.</param>
- private void CustomScrollbar_MouseUp(object sender, MouseEventArgs e)
- {
- this.moThumbMouseDown = false;
- this.moThumbMouseDragging = false;
- }
- /// <summary>
- /// Moves the thumb.
- /// </summary>
- /// <param name="y">The y.</param>
- private void MoveThumb(int y)
- {
- int nRealRange = Maximum - Minimum;
- int nTrackHeight = (this.Height - btnHeight * 2);
- float fThumbHeight = ((float)LargeChange / (float)Maximum) * nTrackHeight;
- int nThumbHeight = (int)fThumbHeight;
- if (nThumbHeight > nTrackHeight)
- {
- nThumbHeight = nTrackHeight;
- fThumbHeight = nTrackHeight;
- }
- if (nThumbHeight < m_intThumbMinHeight)
- {
- nThumbHeight = m_intThumbMinHeight;
- fThumbHeight = m_intThumbMinHeight;
- }
- int nSpot = nClickPoint;
- int nPixelRange = (nTrackHeight - nThumbHeight);
- if (moThumbMouseDown && nRealRange > 0)
- {
- if (nPixelRange > 0)
- {
- int nNewThumbTop = y - (btnHeight + nSpot);
- if (nNewThumbTop < 0)
- {
- moThumbTop = nNewThumbTop = 0;
- }
- else if (nNewThumbTop > nPixelRange)
- {
- moThumbTop = nNewThumbTop = nPixelRange;
- }
- else
- {
- moThumbTop = y - (btnHeight + nSpot);
- }
- float fPerc = (float)moThumbTop / (float)nPixelRange;
- float fValue = fPerc * (Maximum - LargeChange);
- moValue = (int)fValue;
- Application.DoEvents();
- Invalidate();
- }
- }
- }
- /// <summary>
- /// Handles the MouseMove event of the CustomScrollbar control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="MouseEventArgs"/> instance containing the event data.</param>
- private void CustomScrollbar_MouseMove(object sender, MouseEventArgs e)
- {
- if (!moThumbMouseDown)
- return;
- if (moThumbMouseDown == true)
- {
- this.moThumbMouseDragging = true;
- }
- if (this.moThumbMouseDragging)
- {
- MoveThumb(e.Y);
- }
- if (ValueChanged != null)
- ValueChanged(this, new EventArgs());
- if (Scroll != null)
- Scroll(this, new EventArgs());
- }
- }
- }
|