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 LYFZ.ComponentLibrary { [Designer(typeof(ScrollbarControlDesigner))] public class CtlScrollBarH : UserControl { protected Color moChannelColor = Color.Empty; protected Image moUpArrowImage = null; protected Image moDownArrowImage = null; protected Image moThumbArrowImage = null; protected Image moThumbTopImage = null; protected Image moThumbTopSpanImage = null; protected Image moThumbBottomImage = null; protected Image moThumbBottomSpanImage = null; protected Image moThumbMiddleImage = null; protected int moLargeChange = 10; protected int moSmallChange = 1; protected int moMinimum = 0; protected int moMaximum = 100; protected int moValue = 0; private int nClickPoint; protected int moThumbTop = 0; protected bool moAutoSize = false; private bool moThumbDown = false; private bool moThumbDragging = false; public new event EventHandler Scroll = null; public event EventHandler ValueChanged = null; private int GetThumbWidth() { int nTrackWidth = (this.Width - (UpArrowImage.Width + DownArrowImage.Width)); float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; int nThumbWidth = (int)fThumbWidth; if (nThumbWidth > nTrackWidth) { nThumbWidth = nTrackWidth; fThumbWidth = nTrackWidth; } if (nThumbWidth < 56) { nThumbWidth = 56; fThumbWidth = 56; } return nThumbWidth; } public CtlScrollBarH() { InitializeComponent(); SetStyle(ControlStyles.ResizeRedraw, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.DoubleBuffer, true); moChannelColor = Color.FromArgb(194, 211, 255); UpArrowImage = LYFZ.ComponentLibrary.Properties.Resources.leftarrow; DownArrowImage = LYFZ.ComponentLibrary.Properties.Resources.rightarrow; ThumbBottomImage = LYFZ.ComponentLibrary.Properties.Resources.ThumbRight; ThumbBottomSpanImage = LYFZ.ComponentLibrary.Properties.Resources.ThumbSpanRight; ThumbTopImage = LYFZ.ComponentLibrary.Properties.Resources.ThumbLeft; ThumbTopSpanImage = LYFZ.ComponentLibrary.Properties.Resources.ThumbSpanLeft; //ThumbMiddleImage = Resource.ThumbMiddle; ThumbMiddleImage = LYFZ.ComponentLibrary.Properties.Resources.ThumbMiddleH; this.Height = UpArrowImage.Height; base.MinimumSize = new Size(86,this.Height); } protected override void OnPaint(PaintEventArgs e) { e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; if (UpArrowImage != null) { //e.Graphics.DrawImage(UpArrowImage, new Rectangle(new Point(0, 0), new Size(this.Height, UpArrowImage.Width))); e.Graphics.DrawImage(UpArrowImage, new Rectangle(new Point(0, 0), new Size(UpArrowImage.Width, this.Height))); } Brush oBrush = new SolidBrush(moChannelColor); Brush oWhiteBrush = new SolidBrush(Color.FromArgb(255, 255, 255)); //draw channel left and right border colors //e.Graphics.FillRectangle(oWhiteBrush, new Rectangle(0, UpArrowImage.Width, 1, (this.Width - DownArrowImage.Width))); //e.Graphics.FillRectangle(oWhiteBrush, new Rectangle(this.Height - 1, UpArrowImage.Width, 1, (this.Width - DownArrowImage.Width))); e.Graphics.FillRectangle(oWhiteBrush, new Rectangle(UpArrowImage.Width, 0, (this.Width - DownArrowImage.Width), 1)); e.Graphics.FillRectangle(oWhiteBrush, new Rectangle(UpArrowImage.Width, this.Height - 1, (this.Width - DownArrowImage.Width), 1)); //draw channel //e.Graphics.FillRectangle(oBrush, new Rectangle(1, UpArrowImage.Width, this.Height - 2, (this.Width - DownArrowImage.Width))); e.Graphics.FillRectangle(oBrush, new Rectangle(UpArrowImage.Width, 1, (this.Width - DownArrowImage.Width), this.Height - 2)); //draw thumb int nTrackWidth = (this.Width - (UpArrowImage.Width + DownArrowImage.Width)); float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; int nThumbWidth = (int)fThumbWidth; if (nThumbWidth > nTrackWidth) { nThumbWidth = nTrackWidth; fThumbWidth = nTrackWidth; } if (nThumbWidth < 56) { nThumbWidth = 56; fThumbWidth = 56; } //Debug.WriteLine(nThumbWidth.ToString()); float fSpanWidth = (fThumbWidth - (ThumbMiddleImage.Width + ThumbTopImage.Width + ThumbBottomImage.Width)) / 2.0f; int nSpanWidth = (int)fSpanWidth; int nTop = moThumbTop; nTop += UpArrowImage.Width; //draw top //e.Graphics.DrawImage(ThumbTopImage, new Rectangle(1, nTop, this.Height - 2, ThumbTopImage.Width)); e.Graphics.DrawImage(ThumbTopImage, new Rectangle(nTop, 1, ThumbTopImage.Width, this.Height - 2)); nTop += ThumbTopImage.Width; //draw top span Rectangle rect = new Rectangle(1, nTop, this.Height - 2, nSpanWidth); //e.Graphics.DrawImage(ThumbTopSpanImage, 1.0f, (float)nTop, (float)this.Height - 2.0f, (float)fSpanWidth * 2); e.Graphics.DrawImage(ThumbTopSpanImage, (float)nTop, 1.0f, (float)fSpanWidth * 2, (float)this.Height - 2.0f); nTop += nSpanWidth; //draw middle //e.Graphics.DrawImage(ThumbMiddleImage, new Rectangle(1, nTop, this.Height - 2, ThumbMiddleImage.Width)); e.Graphics.DrawImage(ThumbMiddleImage, new Rectangle(nTop, 1, ThumbMiddleImage.Width, this.Height - 2)); nTop += ThumbMiddleImage.Width; //draw top span //rect = new Rectangle(1, nTop, this.Height - 2, nSpanWidth * 2); rect = new Rectangle(nTop, 1, nSpanWidth * 2, this.Height - 2); e.Graphics.DrawImage(ThumbBottomSpanImage, rect); nTop += nSpanWidth; //draw bottom //e.Graphics.DrawImage(ThumbBottomImage, new Rectangle(1, nTop, this.Height - 2, nSpanWidth)); e.Graphics.DrawImage(ThumbBottomImage, new Rectangle(nTop, 1, nSpanWidth, this.Height - 2)); if (DownArrowImage != null) { //e.Graphics.DrawImage(DownArrowImage, new Rectangle(new Point(0, (this.Width - DownArrowImage.Width)), new Size(this.Height, DownArrowImage.Width))); e.Graphics.DrawImage(DownArrowImage, new Rectangle(new Point((this.Width - DownArrowImage.Width), 0), new Size(DownArrowImage.Width, this.Height))); } } public override bool AutoSize { get { return base.AutoSize; } set { base.AutoSize = value; if (base.AutoSize) { this.Height = moUpArrowImage.Height; } } } private void InitializeComponent() { this.SuspendLayout(); // // CustomScrollbar // this.Name = "CustomScrollbar"; this.Size = new System.Drawing.Size(200, 200); 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); } private void CustomScrollbar_MouseDown(object sender, MouseEventArgs e) { Point ptPoint = this.PointToClient(Cursor.Position); int nTrackWidth = (this.Width - (UpArrowImage.Width + DownArrowImage.Width)); float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; int nThumbWidth = (int)fThumbWidth; if (nThumbWidth > nTrackWidth) { nThumbWidth = nTrackWidth; fThumbWidth = nTrackWidth; } if (nThumbWidth < 56) { nThumbWidth = 56; fThumbWidth = 56; } int nTop = moThumbTop; nTop += UpArrowImage.Width; Rectangle thumbrect = new Rectangle(new Point(nTop,1 ), new Size(nThumbWidth,ThumbMiddleImage.Height )); if (thumbrect.Contains(ptPoint)) { //hit the thumb nClickPoint = (ptPoint.X - nTop); this.moThumbDown = true; } Rectangle uparrowrect = new Rectangle(new Point(0,1 ), new Size(UpArrowImage.Width,UpArrowImage.Height )); if (uparrowrect.Contains(ptPoint)) { int nRealRange = (Maximum - Minimum) - LargeChange; int nPixelRange = (nTrackWidth - nThumbWidth); 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; Debug.WriteLine(moValue.ToString()); if (ValueChanged != null) ValueChanged(this, new EventArgs()); if (Scroll != null) Scroll(this, new EventArgs()); Invalidate(); } } } Rectangle downarrowrect = new Rectangle(new Point(UpArrowImage.Width + nTrackWidth,1 ), new Size(UpArrowImage.Width,UpArrowImage.Height )); if (downarrowrect.Contains(ptPoint)) { int nRealRange = (Maximum - Minimum) - LargeChange; int nPixelRange = (nTrackWidth - nThumbWidth); 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; Debug.WriteLine(moValue.ToString()); if (ValueChanged != null) ValueChanged(this, new EventArgs()); if (Scroll != null) Scroll(this, new EventArgs()); Invalidate(); } } } } private void CustomScrollbar_MouseUp(object sender, MouseEventArgs e) { this.moThumbDown = false; this.moThumbDragging = false; } private void MoveThumb(int y) { int nRealRange = Maximum - Minimum; int nTrackWidth = (this.Width - (UpArrowImage.Width + DownArrowImage.Width)); float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; int nThumbWidth = (int)fThumbWidth; if (nThumbWidth > nTrackWidth) { nThumbWidth = nTrackWidth; fThumbWidth = nTrackWidth; } if (nThumbWidth < 56) { nThumbWidth = 56; fThumbWidth = 56; } int nSpot = nClickPoint; int nPixelRange = (nTrackWidth - nThumbWidth); if (moThumbDown && nRealRange > 0) { if (nPixelRange > 0) { int nNewThumbTop = y - (UpArrowImage.Width + nSpot); if (nNewThumbTop < 0) { moThumbTop = nNewThumbTop = 0; } else if (nNewThumbTop > nPixelRange) { moThumbTop = nNewThumbTop = nPixelRange; } else { moThumbTop = y - (UpArrowImage.Width + nSpot); } //figure out value float fPerc = (float)moThumbTop / (float)nPixelRange; float fValue = fPerc * (Maximum - LargeChange); moValue = (int)fValue; Debug.WriteLine(moValue.ToString()); Application.DoEvents(); Invalidate(); } } } private void CustomScrollbar_MouseMove(object sender, MouseEventArgs e) { if (moThumbDown == true) { this.moThumbDragging = true; } if (this.moThumbDragging) { //MoveThumb(e.Y); MoveThumb(e.X); } if (ValueChanged != null) ValueChanged(this, new EventArgs()); if (Scroll != null) Scroll(this, new EventArgs()); } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("LargeChange")] public int LargeChange { get { return moLargeChange; } set { moLargeChange = value; Invalidate(); } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("SmallChange")] public int SmallChange { get { return moSmallChange; } set { moSmallChange = value; Invalidate(); } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Minimum")] public int Minimum { get { return moMinimum; } set { moMinimum = value; Invalidate(); } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Maximum")] public int Maximum { get { return moMaximum; } set { moMaximum = value; Invalidate(); } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Value")] public int Value { get { return moValue; } set { moValue = value; int nTrackWidth = (this.Width - (UpArrowImage.Width + DownArrowImage.Width)); float fThumbWidth = ((float)LargeChange / (float)Maximum) * nTrackWidth; int nThumbWidth = (int)fThumbWidth; if (nThumbWidth > nTrackWidth) { nThumbWidth = nTrackWidth; fThumbWidth = nTrackWidth; } if (nThumbWidth < 56) { nThumbWidth = 56; fThumbWidth = 56; } //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 fTop = fPerc * nPixelRange; moThumbTop = (int)fTop; Invalidate(); } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Channel Color")] public Color ChannelColor { get { return moChannelColor; } set { moChannelColor = value; } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Up Arrow Graphic")] public Image UpArrowImage { get { return moUpArrowImage; } set { moUpArrowImage = value; } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Up Arrow Graphic")] public Image DownArrowImage { get { return moDownArrowImage; } set { moDownArrowImage = value; } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Up Arrow Graphic")] public Image ThumbTopImage { get { return moThumbTopImage; } set { moThumbTopImage = value; } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Up Arrow Graphic")] public Image ThumbTopSpanImage { get { return moThumbTopSpanImage; } set { moThumbTopSpanImage = value; } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Up Arrow Graphic")] public Image ThumbBottomImage { get { return moThumbBottomImage; } set { moThumbBottomImage = value; } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Up Arrow Graphic")] public Image ThumbBottomSpanImage { get { return moThumbBottomSpanImage; } set { moThumbBottomSpanImage = value; } } [EditorBrowsable(EditorBrowsableState.Always), Browsable(true), DefaultValue(false), Category("组件扩展属性"), Description("Up Arrow Graphic")] public Image ThumbMiddleImage { get { return moThumbMiddleImage; } set { moThumbMiddleImage = value; } } } //internal class ScrollbarControlDesigner : System.Windows.Forms.Design.ControlDesigner //{ // public override SelectionRules SelectionRules // { // get // { // SelectionRules selectionRules = base.SelectionRules; // PropertyDescriptor propDescriptor = TypeDescriptor.GetProperties(this.Component)["AutoSize"]; // if (propDescriptor != null) // { // bool autoSize = (bool)propDescriptor.GetValue(this.Component); // if (autoSize) // { // selectionRules = SelectionRules.Visible | SelectionRules.Moveable | SelectionRules.BottomSizeable | SelectionRules.TopSizeable; // } // else // { // selectionRules = SelectionRules.Visible | SelectionRules.AllSizeable | SelectionRules.Moveable; // } // } // return selectionRules; // } // } //} }