615 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			615 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Windows.Forms;
 | |
| using System.Text;
 | |
| using DevComponents.DotNetBar.ScrollBar;
 | |
| using System.Drawing;
 | |
| using DevComponents.DotNetBar.Rendering;
 | |
| using System.Runtime.InteropServices;
 | |
| 
 | |
| namespace DevComponents.DotNetBar.Controls
 | |
| {
 | |
|     internal class ScrollBarImplementation: IDisposable
 | |
|     {
 | |
|         #region Private Variables
 | |
|         private System.Windows.Forms.ScrollBar m_ParentScrollBar = null;
 | |
|         private ScrollBarCore m_ScrollBarCore = null;
 | |
|         private bool m_FirstPaint = true;
 | |
|         private int m_MouseDownTrackOffset = 0;
 | |
|         private Timer m_PaintTimer = null;
 | |
|         private bool m_IsVScrollBar = false;
 | |
|         private IScrollBarExtender m_ParentScrollBarWndProc = null;
 | |
|         private bool m_UseLockWindowUpdate = false;
 | |
|         #endregion
 | |
| 
 | |
|         #region Constructor
 | |
|         public ScrollBarImplementation(System.Windows.Forms.ScrollBar sb)
 | |
|         {
 | |
|             m_ParentScrollBar = sb;
 | |
|             m_ParentScrollBarWndProc = (IScrollBarExtender)m_ParentScrollBar;
 | |
|             m_IsVScrollBar = m_ParentScrollBar is VScrollBar;
 | |
| 
 | |
|             m_PaintTimer = new Timer();
 | |
|             m_PaintTimer.Interval = 50;
 | |
|             m_PaintTimer.Tick += new EventHandler(PaintTimerTick);
 | |
| 
 | |
|             m_ScrollBarCore = new ScrollBarCore(m_ParentScrollBar, true);
 | |
|             //m_ScrollBarCore.IsAppScrollBarStyle = false;
 | |
|             if (m_ParentScrollBar is HScrollBar)
 | |
|                 m_ScrollBarCore.Orientation = eOrientation.Horizontal;
 | |
|             else
 | |
|                 m_ScrollBarCore.Orientation = eOrientation.Vertical;
 | |
|             m_ScrollBarCore.Minimum = m_ParentScrollBar.Minimum;
 | |
|             m_ScrollBarCore.Maximum = m_ParentScrollBar.Maximum;
 | |
|             m_ScrollBarCore.Value = m_ParentScrollBar.Value;
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region Internal Implementation
 | |
|         internal void OnHandleCreated()
 | |
|         {
 | |
|             Themes.SetWindowTheme(m_ParentScrollBar.Handle, "", "");
 | |
|             UpdateScrollValues();
 | |
|         }
 | |
| 
 | |
|         internal bool WndProc(ref Message m)
 | |
|         {
 | |
|             if (m.Msg == (int)WinApi.WindowsMessages.SBM_SETSCROLLINFO || m.Msg == 0x2114 || m.Msg == 0x2115 || m.Msg == (int)WinApi.WindowsMessages.WM_MOUSEMOVE)
 | |
|             {
 | |
|                 CallBaseWndProc(ref m);
 | |
|                 SendDelayPaintMessage();
 | |
|                 return false;
 | |
|             }
 | |
|             else if (m.Msg == (int)WinApi.WindowsMessages.WM_SIZE)
 | |
|             {
 | |
|                 CallBaseWndProc(ref m);
 | |
|                 m_FirstPaint = true;
 | |
|                 SendDelayPaintMessage();
 | |
|                 return false;
 | |
|             }
 | |
|             else if (m.Msg == (int)WinApi.WindowsMessages.WM_ERASEBKGND)
 | |
|             {
 | |
|                 //PaintUsingDC();
 | |
|                 //m.Result = new IntPtr(1);
 | |
|                 return false;
 | |
|             }
 | |
|             else if (m.Msg == (int)WinApi.WindowsMessages.WM_LBUTTONDOWN)
 | |
|             {
 | |
|                 Point p = new Point(WinApi.LOWORD(m.LParam), WinApi.HIWORD(m.LParam));
 | |
|                 InternalMouseDown(new MouseEventArgs(GetMouseButton(m.WParam.ToInt32()), 0, p.X, p.Y, 0));
 | |
|                 return false;
 | |
|             }
 | |
|             else if (m.Msg == (int)WinApi.WindowsMessages.WM_LBUTTONUP)
 | |
|             {
 | |
|                 Point p = new Point(WinApi.LOWORD(m.LParam), WinApi.HIWORD(m.LParam));
 | |
|                 InternalMouseUp(new MouseEventArgs(GetMouseButton(m.WParam.ToInt32()), 0, p.X, p.Y, 0));
 | |
|                 return false;
 | |
|             }
 | |
|             else if (m.Msg == (int)WinApi.WindowsMessages.WM_LBUTTONDBLCLK)
 | |
|             {
 | |
|                 Point p = new Point(WinApi.LOWORD(m.LParam), WinApi.HIWORD(m.LParam));
 | |
|                 InternalMouseDoubleClick(new MouseEventArgs(GetMouseButton(m.WParam.ToInt32()), 0, p.X, p.Y, 0));
 | |
|                 return false;
 | |
|             }
 | |
|             else if (m.Msg == NativeFunctions.WM_USER + 7)
 | |
|             {
 | |
|                 PaintUsingDC();
 | |
|             }
 | |
|             else if (m.Msg == (int)WinApi.WindowsMessages.WM_SYSTIMER)
 | |
|             {
 | |
|                 if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.Track && Control.MouseButtons == MouseButtons.Left)
 | |
|                 {
 | |
|                     Point p = m_ParentScrollBar.PointToClient(Control.MousePosition);
 | |
|                     OnMouseMove(new MouseEventArgs(Control.MouseButtons, 0, p.X, p.Y, 0));
 | |
|                 }
 | |
|             }
 | |
|             else if (m.Msg == (int)WinApi.WindowsMessages.WM_CAPTURECHANGED)
 | |
|             {
 | |
|                 // Recapture the mouse...
 | |
|                 if (m.LParam == IntPtr.Zero && Control.MouseButtons == MouseButtons.Left && m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.Track)
 | |
|                 {
 | |
|                     m_ParentScrollBar.Capture = true;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (m.Msg == (int)WinApi.WindowsMessages.WM_PAINT)
 | |
|             {
 | |
|                 if (m_FirstPaint)
 | |
|                 {
 | |
|                     // Call to base actually updates values returned by GetScrollBarInfo
 | |
|                     CallBaseWndProc(ref m);
 | |
|                     // Repaint the control once that is done
 | |
|                     SendDelayPaintMessage();
 | |
|                     m_FirstPaint = false;
 | |
|                 }
 | |
|                 WinApi.PAINTSTRUCT ps = new WinApi.PAINTSTRUCT();
 | |
|                 IntPtr hdc = WinApi.BeginPaint(m.HWnd, ref ps);
 | |
|                 try
 | |
|                 {
 | |
|                     Graphics g = Graphics.FromHdc(hdc);
 | |
|                     try
 | |
|                     {
 | |
|                         PaintInternal(g, hdc);
 | |
|                     }
 | |
|                     finally
 | |
|                     {
 | |
|                         g.Dispose();
 | |
|                     }
 | |
|                 }
 | |
|                 finally
 | |
|                 {
 | |
|                     WinApi.EndPaint(m.HWnd, ref ps);
 | |
|                 }
 | |
|                 return false;
 | |
|             }
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         private void CallBaseWndProc(ref Message m)
 | |
|         {
 | |
|             m_ParentScrollBarWndProc.CallBaseWndProc(ref m);
 | |
|         }
 | |
| 
 | |
|         private void SendDelayPaintMessage()
 | |
|         {
 | |
|             m_PaintTimer.Start();
 | |
|         }
 | |
| 
 | |
|         void PaintTimerTick(object sender, EventArgs e)
 | |
|         {
 | |
|             m_PaintTimer.Stop();
 | |
|             PaintUsingDC();
 | |
|         }
 | |
| 
 | |
|         private void InternalMouseDoubleClick(MouseEventArgs me)
 | |
|         {
 | |
|             PerformThumbClick(me.X, me.Y);
 | |
|         }
 | |
| 
 | |
|         private void PerformThumbClick(int mouseX, int mouseY)
 | |
|         {
 | |
|             if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.ThumbDecrease)
 | |
|                 this.SetValue(Math.Max(m_ParentScrollBar.Value - m_ParentScrollBar.SmallChange, m_ParentScrollBar.Minimum), ScrollEventType.SmallDecrement);
 | |
|             else if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.ThumbIncrease)
 | |
|                 this.SetValue(Math.Min(m_ParentScrollBar.Value + m_ParentScrollBar.SmallChange, m_ParentScrollBar.Maximum), ScrollEventType.SmallIncrement);
 | |
|             else if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.Control)
 | |
|             {
 | |
|                 if (this.IsVScroll)
 | |
|                 {
 | |
|                     if (mouseY < m_ScrollBarCore.TrackRectangle.Y)
 | |
|                         this.SetValue(Math.Max(m_ParentScrollBar.Value - m_ParentScrollBar.LargeChange, m_ParentScrollBar.Minimum), ScrollEventType.LargeDecrement);
 | |
|                     else if (mouseY > m_ScrollBarCore.TrackRectangle.Bottom)
 | |
|                         this.SetValue(Math.Min(m_ParentScrollBar.Value + m_ParentScrollBar.LargeChange, m_ParentScrollBar.Maximum), ScrollEventType.LargeIncrement);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     if (mouseX < m_ScrollBarCore.TrackRectangle.X)
 | |
|                         this.SetValue(Math.Max(m_ParentScrollBar.Value - m_ParentScrollBar.LargeChange, m_ParentScrollBar.Minimum), ScrollEventType.LargeDecrement);
 | |
|                     else if (mouseX > m_ScrollBarCore.TrackRectangle.Right)
 | |
|                         this.SetValue(Math.Min(m_ParentScrollBar.Value + m_ParentScrollBar.LargeChange, m_ParentScrollBar.Maximum), ScrollEventType.LargeIncrement);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void SetValue(int newValue, ScrollEventType type)
 | |
|         {
 | |
|             //FieldInfo fi = typeof(System.Windows.Forms.ScrollBar).GetField("value", BindingFlags.NonPublic | BindingFlags.Instance);
 | |
|             //if (fi != null)
 | |
|             //{
 | |
|             //    fi.SetValue(this, newValue);
 | |
|             //    UpdateSystemScrollInfo();
 | |
|             //}
 | |
|             //else
 | |
| 
 | |
|             if (m_ParentScrollBar.Value == newValue) return;
 | |
| 
 | |
|             if (m_UseLockWindowUpdate && m_ParentScrollBar.Parent != null)
 | |
|                 NativeFunctions.LockWindowUpdate(m_ParentScrollBar.Parent.Handle);
 | |
|             else
 | |
|                 NativeFunctions.SendMessage(m_ParentScrollBar.Handle, NativeFunctions.WM_SETREDRAW, 0, 0);
 | |
| 
 | |
|             m_ParentScrollBarWndProc.SetValue(newValue, type);
 | |
|             if (m_UseLockWindowUpdate && m_ParentScrollBar.Parent != null)
 | |
|                 NativeFunctions.LockWindowUpdate(IntPtr.Zero);
 | |
|             else
 | |
|                 NativeFunctions.SendMessage(m_ParentScrollBar.Handle, NativeFunctions.WM_SETREDRAW, 1, 0);
 | |
| 
 | |
|             if (m_ParentScrollBar.Parent is DataGridView && type == ScrollEventType.ThumbTrack)
 | |
|             {
 | |
|                 if (m_UseLockWindowUpdate)
 | |
|                     m_ParentScrollBar.Parent.Refresh();
 | |
|                 else
 | |
|                 {
 | |
|                     Point p = m_ParentScrollBar.PointToClient(Control.MousePosition);
 | |
|                     if (!m_ParentScrollBar.ClientRectangle.Contains(p)) 
 | |
|                         m_ParentScrollBar.Parent.Refresh();
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             PaintUsingDC();
 | |
|         }
 | |
| 
 | |
|         //private void UpdateSystemScrollInfo()
 | |
|         //{
 | |
|         //    if (this.IsHandleCreated && this.Enabled)
 | |
|         //    {
 | |
|         //        WinApi.SCROLLINFO si = new WinApi.SCROLLINFO();
 | |
|         //        si.cbSize = Marshal.SizeOf(typeof(WinApi.SCROLLINFO));
 | |
|         //        si.fMask = 0x17;
 | |
|         //        si.nMin = this.Minimum;
 | |
|         //        si.nMax = this.Maximum;
 | |
|         //        si.nPage = this.LargeChange;
 | |
|         //        if (this.RightToLeft == RightToLeft.Yes)
 | |
|         //        {
 | |
|         //            MethodInfo mi = typeof(System.Windows.Forms.ScrollBar).GetMethod("ReflectPosition", BindingFlags.NonPublic | BindingFlags.Instance);
 | |
|         //            if(mi!=null)
 | |
|         //                si.nPos = (int)mi.Invoke(this, new object[]{this.Value});
 | |
|         //            //= this.ReflectPosition(this.value);
 | |
|         //        }
 | |
|         //        else
 | |
|         //        {
 | |
|         //            si.nPos = this.Value;
 | |
|         //        }
 | |
|         //        si.nTrackPos = 0;
 | |
|         //        WinApi.SetScrollInfo(new HandleRef(this, this.Handle), 2, ref si, false);
 | |
|         //    }
 | |
|         //}
 | |
| 
 | |
|         private void InternalMouseUp(MouseEventArgs mouseEventArgs)
 | |
|         {
 | |
|             StopAutoScrollTimer();
 | |
|             m_ScrollBarCore.MouseUp(mouseEventArgs);
 | |
|             m_ParentScrollBar.Invalidate();
 | |
|             m_MouseDownTrackOffset = 0;
 | |
| 
 | |
|             if (m_ParentScrollBar.Capture)
 | |
|                 m_ParentScrollBar.Capture = false;
 | |
|         }
 | |
| 
 | |
|         private void InternalMouseDown(MouseEventArgs me)
 | |
|         {
 | |
|             m_MouseDownTrackOffset = 0;
 | |
|             m_ScrollBarCore.MouseDown(me);
 | |
|             if (m_ScrollBarCore.MouseOverPart != ScrollBarCore.eScrollPart.Track && m_ScrollBarCore.MouseOverPart != ScrollBarCore.eScrollPart.None)
 | |
|             {
 | |
|                 PerformThumbClick(me.X, me.Y);
 | |
|                 StartAutoScrollTimer();
 | |
|             }
 | |
|             else if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.Track)
 | |
|             {
 | |
|                 if (IsVScroll)
 | |
|                     m_MouseDownTrackOffset = me.Y - m_ScrollBarCore.TrackRectangle.Y;
 | |
|                 else
 | |
|                     m_MouseDownTrackOffset = me.X - m_ScrollBarCore.TrackRectangle.X;
 | |
|             }
 | |
|             PaintUsingDC();
 | |
|         }
 | |
| 
 | |
|         private Timer m_Timer = null;
 | |
|         private void StartAutoScrollTimer()
 | |
|         {
 | |
|             if (m_Timer == null)
 | |
|             {
 | |
|                 m_Timer = new Timer();
 | |
|                 m_Timer.Interval = 150;
 | |
|                 m_Timer.Tick += new EventHandler(TimerScrollTick);
 | |
|             }
 | |
|             m_Timer.Start();
 | |
|         }
 | |
| 
 | |
|         private void TimerScrollTick(object sender, EventArgs e)
 | |
|         {
 | |
|             Point p = m_ParentScrollBar.PointToClient(Control.MousePosition);
 | |
|             PerformThumbClick(p.X, p.Y);
 | |
|         }
 | |
| 
 | |
|         private void StopAutoScrollTimer()
 | |
|         {
 | |
|             if (m_Timer != null)
 | |
|             {
 | |
|                 m_Timer.Stop();
 | |
|                 m_Timer.Dispose();
 | |
|                 m_Timer = null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private MouseButtons GetMouseButton(int wParam)
 | |
|         {
 | |
|             MouseButtons mb = MouseButtons.None;
 | |
|             if ((wParam & (int)WinApi.MouseKeyState.MK_LBUTTON) != 0)
 | |
|                 mb |= MouseButtons.Left;
 | |
|             if ((wParam & (int)WinApi.MouseKeyState.MK_MBUTTON) != 0)
 | |
|                 mb |= MouseButtons.Middle;
 | |
|             if ((wParam & (int)WinApi.MouseKeyState.MK_RBUTTON) != 0)
 | |
|                 mb |= MouseButtons.Right;
 | |
|             if ((wParam & (int)WinApi.MouseKeyState.MK_XBUTTON1) != 0)
 | |
|                 mb |= MouseButtons.XButton1;
 | |
|             if ((wParam & (int)WinApi.MouseKeyState.MK_XBUTTON2) != 0)
 | |
|                 mb |= MouseButtons.XButton2;
 | |
| 
 | |
|             return mb;
 | |
|         }
 | |
| 
 | |
|         private void PaintUsingDC()
 | |
|         {
 | |
|             IntPtr hdc = WinApi.GetWindowDC(m_ParentScrollBar.Handle);
 | |
|             try
 | |
|             {
 | |
|                 Graphics g = Graphics.FromHdc(hdc);
 | |
|                 try
 | |
|                 {
 | |
|                     PaintInternal(g, hdc);
 | |
|                 }
 | |
|                 finally
 | |
|                 {
 | |
|                     g.Dispose();
 | |
|                 }
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 WinApi.ReleaseDC(m_ParentScrollBar.Handle, hdc);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void PaintInternal(Graphics g, IntPtr hdc)
 | |
|         {
 | |
|             UpdateScrollValues();
 | |
|             using (BufferedBitmap bmp = new BufferedBitmap(g, new Rectangle(0, 0, m_ParentScrollBar.Width, m_ParentScrollBar.Height)))
 | |
|             {
 | |
|                 m_ScrollBarCore.Paint(GetItemPaintArgs(bmp.Graphics));
 | |
|                 bmp.Render(g);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private ItemPaintArgs GetItemPaintArgs(Graphics g)
 | |
|         {
 | |
|             ItemPaintArgs pa = new ItemPaintArgs(m_ParentScrollBar as IOwner, m_ParentScrollBar, g, GetColorScheme());
 | |
|             pa.Renderer = this.GetRenderer();
 | |
|             pa.DesignerSelection = false;
 | |
|             pa.GlassEnabled = false;
 | |
|             return pa;
 | |
|         }
 | |
| 
 | |
|         private ColorScheme m_ColorScheme = null;
 | |
|         /// <summary>
 | |
|         /// Returns the color scheme used by control. Color scheme for Office2007 style will be retrived from the current renderer instead of
 | |
|         /// local color scheme referenced by ColorScheme property.
 | |
|         /// </summary>
 | |
|         /// <returns>An instance of ColorScheme object.</returns>
 | |
|         protected virtual ColorScheme GetColorScheme()
 | |
|         {
 | |
|             BaseRenderer r = GetRenderer();
 | |
|             if (r is Office2007Renderer)
 | |
|                 return ((Office2007Renderer)r).ColorTable.LegacyColors;
 | |
|             if (m_ColorScheme == null)
 | |
|                 m_ColorScheme = new ColorScheme(eDotNetBarStyle.Office2007);
 | |
|             return m_ColorScheme;
 | |
|         }
 | |
| 
 | |
|         private Rendering.BaseRenderer m_DefaultRenderer = null;
 | |
|         private Rendering.BaseRenderer m_Renderer = null;
 | |
|         private eRenderMode m_RenderMode = eRenderMode.Global;
 | |
|         /// <summary>
 | |
|         /// Returns the renderer control will be rendered with.
 | |
|         /// </summary>
 | |
|         /// <returns>The current renderer.</returns>
 | |
|         public virtual Rendering.BaseRenderer GetRenderer()
 | |
|         {
 | |
|             if (m_RenderMode == eRenderMode.Global && Rendering.GlobalManager.Renderer != null)
 | |
|                 return Rendering.GlobalManager.Renderer;
 | |
|             else if (m_RenderMode == eRenderMode.Custom && m_Renderer != null)
 | |
|                 return m_Renderer;
 | |
| 
 | |
|             if (m_DefaultRenderer == null)
 | |
|                 m_DefaultRenderer = new Rendering.Office2007Renderer();
 | |
| 
 | |
|             return m_DefaultRenderer;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the redering mode used by control. Default value is eRenderMode.Global which means that static GlobalManager.Renderer is used. If set to Custom then Renderer property must
 | |
|         /// also be set to the custom renderer that will be used.
 | |
|         /// </summary>
 | |
|         public eRenderMode RenderMode
 | |
|         {
 | |
|             get { return m_RenderMode; }
 | |
|             set
 | |
|             {
 | |
|                 if (m_RenderMode != value)
 | |
|                 {
 | |
|                     m_RenderMode = value;
 | |
|                     m_ParentScrollBar.Invalidate(true);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the custom renderer used by the items on this control. RenderMode property must also be set to eRenderMode.Custom in order renderer
 | |
|         /// specified here to be used.
 | |
|         /// </summary>
 | |
|         public DevComponents.DotNetBar.Rendering.BaseRenderer Renderer
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return m_Renderer;
 | |
|             }
 | |
|             set { m_Renderer = value; }
 | |
|         }
 | |
| 
 | |
|         internal void OnMouseEnter(EventArgs e)
 | |
|         {
 | |
|             if (m_ParentScrollBar.Capture)
 | |
|                 m_ParentScrollBar.Capture = false;
 | |
|         }
 | |
| 
 | |
|         internal void OnMouseLeave(EventArgs e)
 | |
|         {
 | |
|             StopAutoScrollTimer();
 | |
|             if (m_ScrollBarCore.MouseOverPart != ScrollBarCore.eScrollPart.None && Control.MouseButtons == MouseButtons.Left)
 | |
|                 m_ParentScrollBar.Capture = true;
 | |
|             if (m_ScrollBarCore.IsMouseDown && Control.MouseButtons == MouseButtons.None)
 | |
|             {
 | |
|                 m_ScrollBarCore.MouseUp(new MouseEventArgs(MouseButtons.Left, 0, -10, -10, 0));
 | |
|                 SendDelayPaintMessage();
 | |
|             }
 | |
|             else
 | |
|                 m_ScrollBarCore.MouseLeave();
 | |
|         }
 | |
| 
 | |
|         internal void OnMouseMove(MouseEventArgs e)
 | |
|         {
 | |
|             m_ScrollBarCore.MouseMove(e);
 | |
|             if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.Track && e.Button == MouseButtons.Left)
 | |
|             {
 | |
|                 Point p = m_ParentScrollBar.PointToClient(Control.MousePosition);
 | |
|                 SetValue(ValueFromMouseCoordinates(p), ScrollEventType.ThumbTrack);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private int ValueFromMouseCoordinates(Point p)
 | |
|         {
 | |
|             if (IsVScroll)
 | |
|             {
 | |
|                 int trackY = p.Y - m_MouseDownTrackOffset;
 | |
|                 trackY = Math.Max(trackY, m_ScrollBarCore.ThumbDecreaseRectangle.Bottom);
 | |
|                 trackY = Math.Min(trackY, m_ScrollBarCore.ThumbIncreaseRectangle.Y - GetTrackSize());
 | |
|                 trackY -= m_ScrollBarCore.ThumbDecreaseRectangle.Bottom;
 | |
| 
 | |
|                 int totalSize = GetAvailableTrackArea() - GetTrackSize();
 | |
|                 return (int)((m_ParentScrollBar.Maximum - m_ParentScrollBar.Minimum) * ((float)trackY / (float)totalSize));
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 int trackX = p.X - m_MouseDownTrackOffset;
 | |
|                 trackX = Math.Max(trackX, m_ScrollBarCore.ThumbDecreaseRectangle.Right);
 | |
|                 trackX = Math.Min(trackX, m_ScrollBarCore.ThumbIncreaseRectangle.X - GetTrackSize());
 | |
|                 trackX -= m_ScrollBarCore.ThumbDecreaseRectangle.Right;
 | |
| 
 | |
|                 int totalSize = GetAvailableTrackArea() - GetTrackSize();
 | |
|                 return (int)((m_ParentScrollBar.Maximum - m_ParentScrollBar.Minimum) * ((float)trackX / (float)totalSize));
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private int GetTrackSize()
 | |
|         {
 | |
|             if (IsVScroll)
 | |
|                 return m_ScrollBarCore.TrackRectangle.Height;
 | |
|             else
 | |
|                 return m_ScrollBarCore.TrackRectangle.Width;
 | |
|         }
 | |
| 
 | |
|         private int GetAvailableTrackArea()
 | |
|         {
 | |
|             if (IsVScroll)
 | |
|                 return m_ScrollBarCore.DisplayRectangle.Height - m_ScrollBarCore.ThumbDecreaseRectangle.Height - m_ScrollBarCore.ThumbIncreaseRectangle.Height;
 | |
|             else
 | |
|                 return m_ScrollBarCore.DisplayRectangle.Width - m_ScrollBarCore.ThumbDecreaseRectangle.Width - m_ScrollBarCore.ThumbIncreaseRectangle.Width;
 | |
|         }
 | |
| 
 | |
|         private bool IsVScroll
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return m_IsVScrollBar;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void UpdateScrollValues()
 | |
|         {
 | |
|             WinApi.SCROLLBARINFO psbi = new WinApi.SCROLLBARINFO();
 | |
|             psbi.cbSize = Marshal.SizeOf(psbi);
 | |
| 
 | |
|             WinApi.GetScrollBarInfo(m_ParentScrollBar.Handle, (uint)WinApi.eObjectId.OBJID_CLIENT, ref psbi);
 | |
| 
 | |
|             Rectangle displayRect = new Rectangle(0, 0, m_ParentScrollBar.Width, m_ParentScrollBar.Height);
 | |
| 
 | |
|             if (IsVScroll)
 | |
|             {
 | |
|                 if (m_ScrollBarCore.DisplayRectangle != displayRect)
 | |
|                     m_ScrollBarCore.DisplayRectangle = displayRect;
 | |
| 
 | |
|                 Rectangle thumbRect = new Rectangle(displayRect.X, displayRect.Y, displayRect.Width, psbi.dxyLineButton);
 | |
|                 if (m_ScrollBarCore.ThumbDecreaseRectangle != thumbRect)
 | |
|                     m_ScrollBarCore.ThumbDecreaseRectangle = thumbRect;
 | |
| 
 | |
|                 thumbRect = new Rectangle(displayRect.X, displayRect.Bottom - psbi.dxyLineButton, displayRect.Width, psbi.dxyLineButton);
 | |
|                 if (m_ScrollBarCore.ThumbIncreaseRectangle != thumbRect)
 | |
|                     m_ScrollBarCore.ThumbIncreaseRectangle = thumbRect;
 | |
| 
 | |
|                 thumbRect = new Rectangle(displayRect.X, displayRect.Y + psbi.xyThumbTop, displayRect.Width, psbi.xyThumbBottom - psbi.xyThumbTop);
 | |
|                 if (m_ScrollBarCore.TrackRectangle != thumbRect)
 | |
|                     m_ScrollBarCore.TrackRectangle = thumbRect;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 if (m_ScrollBarCore.DisplayRectangle != displayRect)
 | |
|                     m_ScrollBarCore.DisplayRectangle = displayRect;
 | |
| 
 | |
|                 Rectangle thumbRect = new Rectangle(displayRect.X, displayRect.Y, psbi.dxyLineButton, displayRect.Height);
 | |
|                 if (m_ScrollBarCore.ThumbDecreaseRectangle != thumbRect)
 | |
|                     m_ScrollBarCore.ThumbDecreaseRectangle = thumbRect;
 | |
| 
 | |
|                 thumbRect = new Rectangle(displayRect.Right - psbi.dxyLineButton, displayRect.Y, psbi.dxyLineButton, displayRect.Height);
 | |
|                 if (m_ScrollBarCore.ThumbIncreaseRectangle != thumbRect)
 | |
|                     m_ScrollBarCore.ThumbIncreaseRectangle = thumbRect;
 | |
| 
 | |
|                 thumbRect = new Rectangle(displayRect.X + psbi.xyThumbTop, displayRect.Y, psbi.xyThumbBottom - psbi.xyThumbTop, displayRect.Height);
 | |
|                 if (m_ScrollBarCore.TrackRectangle != thumbRect)
 | |
|                     m_ScrollBarCore.TrackRectangle = thumbRect;
 | |
|             }
 | |
| 
 | |
|             if (m_ScrollBarCore.Minimum != m_ParentScrollBar.Minimum)
 | |
|                 m_ScrollBarCore.Minimum = m_ParentScrollBar.Minimum;
 | |
|             if (m_ScrollBarCore.Maximum != m_ParentScrollBar.Maximum)
 | |
|                 m_ScrollBarCore.Maximum = m_ParentScrollBar.Maximum;
 | |
|             if (m_ScrollBarCore.SmallChange != m_ParentScrollBar.SmallChange)
 | |
|                 m_ScrollBarCore.SmallChange = m_ParentScrollBar.SmallChange;
 | |
|             if (m_ScrollBarCore.LargeChange != m_ParentScrollBar.LargeChange)
 | |
|                 m_ScrollBarCore.LargeChange = m_ParentScrollBar.LargeChange;
 | |
|             if (m_ScrollBarCore.Value != m_ParentScrollBar.Value)
 | |
|                 m_ScrollBarCore.Value = m_ParentScrollBar.Value;
 | |
|         }
 | |
| 
 | |
|         internal void NotifyInvalidate(Rectangle invalidatedArea)
 | |
|         {
 | |
| 
 | |
|         }
 | |
| 
 | |
|         //public bool IsAppScrollBarStyle
 | |
|         //{
 | |
|         //    get { return m_ScrollBarCore.IsAppScrollBarStyle; }
 | |
|         //    set
 | |
|         //    {
 | |
|         //        m_ScrollBarCore.IsAppScrollBarStyle = value;
 | |
|         //        m_ParentScrollBar.Invalidate();
 | |
|         //    }
 | |
|         //}
 | |
|         #endregion
 | |
| 
 | |
|         #region IDisposable Members
 | |
| 
 | |
|         public void Dispose()
 | |
|         {
 | |
|             if (m_ScrollBarCore != null)
 | |
|             {
 | |
|                 m_ScrollBarCore.Dispose();
 | |
|                 m_ScrollBarCore = null;
 | |
|             }
 | |
|             if (m_PaintTimer != null)
 | |
|             {
 | |
|                 m_PaintTimer.Stop();
 | |
|                 m_PaintTimer.Dispose();
 | |
|                 m_PaintTimer = null;
 | |
|             }
 | |
|             StopAutoScrollTimer();
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         internal interface IScrollBarExtender
 | |
|         {
 | |
|             void CallBaseWndProc(ref Message m);
 | |
|             void SetValue(int newValue, ScrollEventType type);
 | |
|         }
 | |
|     }
 | |
| }
 |