// *********************************************************************** // Assembly : HZH_Controls // Created : 2019-09-19 // // *********************************************************************** // // Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com // // // 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 { /// /// Class UCVScrollbar. /// Implements the /// /// [Designer(typeof(ScrollbarControlDesigner))] [DefaultEvent("Scroll")] public class UCVScrollbar : UCControlBase { /// /// The mo large change /// protected int moLargeChange = 10; /// /// The mo small change /// protected int moSmallChange = 1; /// /// The mo minimum /// protected int moMinimum = 0; /// /// The mo maximum /// protected int moMaximum = 100; /// /// The mo value /// protected int moValue = 0; /// /// The n click point /// private int nClickPoint; /// /// The mo thumb top /// protected int moThumbTop = 0; /// /// The mo automatic size /// protected bool moAutoSize = false; /// /// The mo thumb down /// private bool moThumbMouseDown = false; /// /// The mo thumb dragging /// private bool moThumbMouseDragging = false; /// /// Occurs when [scroll]. /// public new event EventHandler Scroll = null; /// /// Occurs when [value changed]. /// public event EventHandler ValueChanged = null; /// /// The BTN height /// private int btnHeight = 18; /// /// The m int thumb minimum height /// private int m_intThumbMinHeight = 15; /// /// Gets or sets the height of the BTN. /// /// The height of the BTN. public int BtnHeight { get { return btnHeight; } set { btnHeight = value; } } /// /// Gets or sets the large change. /// /// The large change. [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("LargeChange")] public int LargeChange { get { return moLargeChange; } set { moLargeChange = value; Invalidate(); } } /// /// Gets or sets the small change. /// /// The small change. [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("SmallChange")] public int SmallChange { get { return moSmallChange; } set { moSmallChange = value; Invalidate(); } } /// /// Gets or sets the minimum. /// /// The minimum. [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("Minimum")] public int Minimum { get { return moMinimum; } set { moMinimum = value; Invalidate(); } } /// /// Gets or sets the maximum. /// /// The maximum. [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("自定义"), Description("Maximum")] public int Maximum { get { return moMaximum; } set { moMaximum = value; Invalidate(); } } /// /// Gets or sets the value. /// /// The 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(); } } /// /// Gets or sets a value indicating whether [automatic size]. /// /// true if [automatic size]; otherwise, false. public override bool AutoSize { get { return base.AutoSize; } set { base.AutoSize = value; if (base.AutoSize) { this.Width = 15; } } } /// /// The thumb color /// private Color thumbColor = Color.FromArgb(255, 77, 58); /// /// Gets or sets the color of the thumb. /// /// The color of the thumb. public Color ThumbColor { get { return thumbColor; } set { thumbColor = value; } } /// /// Initializes a new instance of the class. /// 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); } /// /// Initializes the component. /// 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); } /// /// 引发 事件。 /// /// 包含事件数据的 。 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); } /// /// Handles the MouseDown event of the CustomScrollbar control. /// /// The source of the event. /// The instance containing the event data. 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(); } } } } } } /// /// Handles the MouseUp event of the CustomScrollbar control. /// /// The source of the event. /// The instance containing the event data. private void CustomScrollbar_MouseUp(object sender, MouseEventArgs e) { this.moThumbMouseDown = false; this.moThumbMouseDragging = false; } /// /// Moves the thumb. /// /// The y. 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(); } } } /// /// Handles the MouseMove event of the CustomScrollbar control. /// /// The source of the event. /// The instance containing the event data. 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()); } } }