123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485 |
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace HZH_Controls.Controls
- {
- [Designer(typeof(ScrollbarControlDesigner))]
- [DefaultEvent("Scroll")]
- public class UCHScrollbar : UCControlBase
- {
- #region 属性 English:attribute
- /// <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 moThumbLeft = 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 btnWidth = 18;
- /// <summary>
- /// The m int thumb minimum height
- /// </summary>
- private int m_intThumbMinWidth = 15;
- /// <summary>
- /// Gets or sets the height of the BTN.
- /// </summary>
- /// <value>The height of the BTN.</value>
- public int BtnWidth
- {
- get { return btnWidth; }
- set { btnWidth = 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 nTrackWidth = (this.Width - btnWidth * 2);
- 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();
- }
- }
- /// <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; }
- }
- #endregion
- public UCHScrollbar()
- {
- 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();
- 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
- /// <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 nTrackWidth = (this.Width - btnWidth * 2);
- 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();
- }
- }
- }
- }
- }
- }
- /// <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="x">The y.</param>
- private void MoveThumb(int x)
- {
- int nRealRange = Maximum - Minimum;
- int nTrackWidth = (this.Width - btnWidth * 2);
- 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 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 - 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.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();
- //draw thumb
- int nTrackWidth = (this.Width - btnWidth * 2);
- 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;
- 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), 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), GraphDirection.Rightward);
- }
- }
- }
|