using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace DPumpHydr.WinFrmUI.WenSkin.Controls { [Designer(typeof(ScrollbarControlDesigner))] [DefaultEvent("Scroll")] public class UCHScrollbar : UserControl { #region 属性 English:attribute /// /// 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 moThumbLeft = 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 btnWidth = 18; /// /// The m int thumb minimum height /// private int m_intThumbMinWidth = 15; /// /// Gets or sets the height of the BTN. /// /// The height of the BTN. public int BtnWidth { get { return btnWidth; } set { btnWidth = 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; if (moValue > moMaximum) moValue = moMaximum; int nTrackWidth = (this.Width - btnWidth * 2); float fThumbWidth = nTrackWidth - Maximum; //float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; int nThumbWidth = (int)fThumbWidth; if (nThumbWidth > nTrackWidth) { nThumbWidth = nTrackWidth; fThumbWidth = nTrackWidth; } if (nThumbWidth < m_intThumbMinWidth) { nThumbWidth = m_intThumbMinWidth; fThumbWidth = m_intThumbMinWidth; } //figure out value int nPixelRange = nTrackWidth - nThumbWidth; int nRealRange = (Maximum - Minimum) - LargeChange; float fPerc = 0.0f; if (nRealRange != 0) { fPerc = (float)moValue / (float)nRealRange; } float fLeft = fPerc * nPixelRange; moThumbLeft = (int)fLeft; 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(104, 104, 104); /// /// Gets or sets the color of the thumb. /// /// The color of the thumb. public Color ThumbColor { get { return thumbColor; } set { thumbColor = value; } } #endregion public UCHScrollbar() { InitializeComponent(); 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); } /// /// 圆角角度 /// /// The coner radius. [Description("圆角角度"), Category("自定义")] public virtual int ConerRadius { get; set; } = 3; /// /// Initializes the component. /// private void InitializeComponent() { this.SuspendLayout(); this.MinimumSize = new System.Drawing.Size(0, 10); this.Name = "UCHScrollbar"; this.Size = new System.Drawing.Size(150, 18); 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); } #region 鼠标事件 English:Mouse event /// /// 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) { if (Maximum <= 0) { return; } Point ptPoint = this.PointToClient(Cursor.Position); int nTrackWidth = (this.Width - btnWidth * 2); float fThumbWidth = nTrackWidth - Maximum; //float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; int nThumbWidth = (int)fThumbWidth; if (nThumbWidth > nTrackWidth) { nThumbWidth = nTrackWidth; fThumbWidth = nTrackWidth; } if (nThumbWidth < m_intThumbMinWidth) { nThumbWidth = m_intThumbMinWidth; fThumbWidth = m_intThumbMinWidth; } int nLeft = moThumbLeft; nLeft += btnWidth; Rectangle thumbrect = new Rectangle(new Point(nLeft, 1), new Size(nThumbWidth, this.Height - 2)); //滑块 if (thumbrect.Contains(ptPoint)) { //hit the thumb nClickPoint = (ptPoint.X - nLeft); this.moThumbMouseDown = true; } else { //左按钮 Rectangle leftarrowrect = new Rectangle(new Point(0, 1), new Size(btnWidth, this.Height)); if (leftarrowrect.Contains(ptPoint)) { int nRealRange = (Maximum - Minimum) - LargeChange; int nPixelRange = (nTrackWidth - nThumbWidth); if (nRealRange > 0) { if (nPixelRange > 0) { if ((moThumbLeft - SmallChange) < 0) moThumbLeft = 0; else moThumbLeft -= SmallChange; //figure out value float fPerc = (float)moThumbLeft / (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 rightarrowrect = new Rectangle(new Point(btnWidth + nTrackWidth, 1), new Size(btnWidth, this.Height)); if (rightarrowrect.Contains(ptPoint)) { int nRealRange = (Maximum - Minimum) - LargeChange; int nPixelRange = (nTrackWidth - nThumbWidth); if (nRealRange > 0) { if (nPixelRange > 0) { if ((moThumbLeft + SmallChange) > nPixelRange) moThumbLeft = nPixelRange; else moThumbLeft += SmallChange; //figure out value float fPerc = (float)moThumbLeft / (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; Application.DoEvents(); } /// /// Moves the thumb. /// /// The y. private void MoveThumb(int x) { int nRealRange = Maximum - Minimum; int nTrackWidth = (this.Width - btnWidth * 2); // float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; float fThumbWidth = nTrackWidth - Maximum; int nThumbWidth = (int)fThumbWidth; if (nThumbWidth > nTrackWidth) { nThumbWidth = nTrackWidth; fThumbWidth = nTrackWidth; } if (nThumbWidth < m_intThumbMinWidth) { nThumbWidth = m_intThumbMinWidth; fThumbWidth = m_intThumbMinWidth; } int nSpot = nClickPoint; int nPixelRange = (nTrackWidth - nThumbWidth); if (moThumbMouseDown && nRealRange > 0) { if (nPixelRange > 0) { int nNewThumbLeft = x - (btnWidth + nSpot); if (nNewThumbLeft < 0) { moThumbLeft = nNewThumbLeft = 0; } else if (nNewThumbLeft > nPixelRange) { moThumbLeft = nNewThumbLeft = nPixelRange; } else { moThumbLeft = x - (btnWidth + nSpot); } float fPerc = (float)moThumbLeft / (float)nPixelRange; float fValue = fPerc * (Maximum - (nNewThumbLeft == nPixelRange ? 0 : LargeChange)); //float fValue = fPerc * (Maximum - LargeChange); if (Math.Abs(moValue - fValue) < 1) { return; } moValue = (int)fValue; Invalidate(); try { Application.DoEvents(); } catch { } } } } /// /// 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.X); } if (ValueChanged != null) ValueChanged(this, new EventArgs()); if (Scroll != null) Scroll(this, new EventArgs()); } #endregion protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); e.Graphics.SetGDIHigh(); if (Maximum > 0) { //draw thumb int nTrackWidth = (this.Width - btnWidth * 2); //float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; float fThumbWidth = nTrackWidth - Maximum; int nThumbWidth = (int)fThumbWidth; if (nThumbWidth > nTrackWidth) { nThumbWidth = nTrackWidth; fThumbWidth = nTrackWidth; } if (nThumbWidth < m_intThumbMinWidth) { nThumbWidth = m_intThumbMinWidth; fThumbWidth = m_intThumbMinWidth; } int nLeft = moThumbLeft; nLeft += btnWidth; if (nLeft + nThumbWidth > this.Width - btnWidth) nLeft = this.Width - btnWidth - nThumbWidth; e.Graphics.FillPath(new SolidBrush(thumbColor), new Rectangle(nLeft, 1, nThumbWidth, this.Height - 3).CreateRoundedRectanglePath(this.ConerRadius)); } ControlHelper.PaintTriangle(e.Graphics, new SolidBrush(thumbColor), new Point(btnWidth - Math.Min(5, this.Height / 2), this.Height / 2), Math.Min(5, this.Height / 2), ControlHelper.GraphDirection.Leftward); ControlHelper.PaintTriangle(e.Graphics, new SolidBrush(thumbColor), new Point(this.Width - (btnWidth - Math.Min(5, this.Height / 2)), this.Height / 2), Math.Min(5, this.Height / 2), ControlHelper.GraphDirection.Rightward); } } }