401 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			401 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.ComponentModel;
 | |
| using System.Drawing;
 | |
| using System.Data;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// Summary description for ScrollButton.
 | |
| 	/// </summary>
 | |
| 	[ToolboxItem(false)]
 | |
| 	internal class ScrollButton : System.Windows.Forms.UserControl
 | |
| 	{
 | |
| 		private bool m_MouseOver=false;
 | |
| 		private bool m_MouseDown=false;
 | |
| 		private eOrientation m_Orientation=eOrientation.Horizontal;
 | |
| 		private eItemAlignment m_ButtonAlignment=eItemAlignment.Near;
 | |
| 		private System.Windows.Forms.Timer m_ScrollTimer=null;
 | |
| 		public ColorScheme _Scheme=null;
 | |
| 		private ThemeScrollBar m_ThemeScrollBar=null;
 | |
| 
 | |
| 		public bool UseThemes=false;
 | |
| 		public bool UseTimer=true;
 | |
| 		public bool StandardButton=false;
 | |
| 
 | |
| 		public ScrollButton()
 | |
| 		{
 | |
| 			this.SetStyle(ControlStyles.Selectable,false);
 | |
| 			this.SetStyle(ControlStyles.UserPaint,true);
 | |
| 			this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
 | |
| 			this.SetStyle(ControlStyles.Opaque,true);
 | |
| 			this.SetStyle(ControlStyles.ResizeRedraw,true);
 | |
| 			this.SetStyle(DisplayHelp.DoubleBufferFlag,true);
 | |
| 			this.TabStop=false;
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnPaint(PaintEventArgs e)
 | |
| 		{
 | |
| 			Graphics g=e.Graphics;
 | |
| 			if(StandardButton)
 | |
| 			{
 | |
| 				PaintStandardButton(e);
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			if(m_MouseOver)
 | |
| 			{
 | |
| 				if(_Scheme==null)
 | |
| 				{
 | |
| 					using(SolidBrush brush=new SolidBrush(ColorFunctions.HoverBackColor(g)))
 | |
| 						g.FillRectangle(brush,this.DisplayRectangle);
 | |
| 					//g.Clear(ColorFunctions.HoverBackColor(g));
 | |
| 					NativeFunctions.DrawRectangle(g,SystemPens.Highlight,this.ClientRectangle);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					if(!_Scheme.ItemHotBackground2.IsEmpty)
 | |
| 					{
 | |
| 						System.Drawing.Drawing2D.LinearGradientBrush gradient=BarFunctions.CreateLinearGradientBrush(this.ClientRectangle,_Scheme.ItemHotBackground,_Scheme.ItemHotBackground2,_Scheme.ItemHotBackgroundGradientAngle);
 | |
| 						g.FillRectangle(gradient,this.ClientRectangle);
 | |
| 						gradient.Dispose();
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						using(SolidBrush brush=new SolidBrush(_Scheme.ItemHotBackground))
 | |
| 							g.FillRectangle(brush,this.DisplayRectangle);
 | |
| 						//g.Clear(_Scheme.ItemHotBackground);
 | |
| 					}
 | |
| 					NativeFunctions.DrawRectangle(g,new Pen(_Scheme.ItemHotBorder),this.ClientRectangle);
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				if(_Scheme==null)
 | |
| 				{
 | |
| 					using(SolidBrush brush=new SolidBrush(SystemColors.Control))
 | |
| 						g.FillRectangle(brush,this.DisplayRectangle);
 | |
| 					//g.Clear(SystemColors.Control);
 | |
| 					NativeFunctions.DrawRectangle(g,SystemPens.ControlDark,this.ClientRectangle);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					if(_Scheme.ItemBackground.IsEmpty)
 | |
| 					{
 | |
| 						using(SolidBrush brush=new SolidBrush(_Scheme.BarBackground))
 | |
| 							g.FillRectangle(brush,this.DisplayRectangle);
 | |
| 						//g.Clear(_Scheme.BarBackground);
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						if(_Scheme.ItemBackground2.IsEmpty)
 | |
| 						{
 | |
| 							using(SolidBrush brush=new SolidBrush(_Scheme.ItemBackground))
 | |
| 								g.FillRectangle(brush,this.DisplayRectangle);
 | |
| 							//g.Clear(_Scheme.ItemBackground);
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
| 							using(System.Drawing.Drawing2D.LinearGradientBrush gradient=BarFunctions.CreateLinearGradientBrush(this.DisplayRectangle,_Scheme.ItemBackground,_Scheme.ItemBackground2,_Scheme.ItemBackgroundGradientAngle))
 | |
| 								g.FillRectangle(gradient,this.DisplayRectangle);
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			if(m_Orientation==eOrientation.Horizontal)
 | |
| 			{
 | |
| 				if(m_ButtonAlignment==eItemAlignment.Far)
 | |
| 				{
 | |
| 					Point[] p=new Point[3];
 | |
| 					p[0].X=(this.ClientRectangle.Width/2)-2;
 | |
| 					p[0].Y=(this.ClientRectangle.Height-8)/2;
 | |
| 					p[1].X=p[0].X;
 | |
| 					p[1].Y=p[0].Y+8;
 | |
| 					p[2].X=p[0].X+4;
 | |
| 					p[2].Y=p[0].Y+4;
 | |
| 					if(_Scheme==null)
 | |
| 						g.FillPolygon(SystemBrushes.ControlText,p);
 | |
| 					else
 | |
| 						g.FillPolygon(new SolidBrush(_Scheme.ItemText),p);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					Point[] p=new Point[3];
 | |
| 					p[0].X=(this.ClientRectangle.Width/2)+2;
 | |
| 					p[0].Y=(this.ClientRectangle.Height-8)/2;
 | |
| 					p[1].X=p[0].X;
 | |
| 					p[1].Y=p[0].Y+8;
 | |
| 					p[2].X=p[0].X-4;
 | |
| 					p[2].Y=p[0].Y+4;
 | |
| 					if(_Scheme==null)
 | |
| 						g.FillPolygon(SystemBrushes.ControlText,p);
 | |
| 					else
 | |
| 						g.FillPolygon(new SolidBrush(_Scheme.ItemText),p);
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				if(m_ButtonAlignment==eItemAlignment.Far)
 | |
| 				{
 | |
| 					Point[] p=new Point[3];
 | |
| 					p[0].X=(this.ClientRectangle.Width)/2-3;
 | |
| 					p[0].Y=(this.ClientRectangle.Height-4)/2;
 | |
| 					p[1].X=p[0].X+7;
 | |
| 					p[1].Y=p[0].Y;
 | |
| 					p[2].X=p[0].X+3;
 | |
| 					p[2].Y=p[0].Y+4;
 | |
| 					if(_Scheme==null)
 | |
| 						g.FillPolygon(SystemBrushes.ControlText,p);
 | |
| 					else
 | |
| 						g.FillPolygon(new SolidBrush(_Scheme.ItemText),p);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					Point[] p=new Point[3];
 | |
| 					p[0].X=(this.ClientRectangle.Width)/2-3;
 | |
| 					p[0].Y=(this.ClientRectangle.Height+3)/2;
 | |
| 					p[1].X=p[0].X+7;
 | |
| 					p[1].Y=p[0].Y;
 | |
| 					p[2].X=p[0].X+3;
 | |
| 					p[2].Y=p[0].Y-4;
 | |
| 					if(_Scheme==null)
 | |
| 						g.FillPolygon(SystemBrushes.ControlText,p);
 | |
| 					else
 | |
| 						g.FillPolygon(new SolidBrush(_Scheme.ItemText),p);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void PaintStandardButton(PaintEventArgs e)
 | |
| 		{
 | |
| 			Graphics g=e.Graphics;
 | |
| 			if(UseThemes)
 | |
| 			{
 | |
| 				ThemeScrollBar scroll=this.ThemeScrollBar;
 | |
| 				ThemeScrollBarParts part=ThemeScrollBarParts.ArrowBtn;
 | |
| 				ThemeScrollBarStates state=ThemeScrollBarStates.ArrowBtnUpNormal;
 | |
| 
 | |
| 				if(m_MouseOver)
 | |
| 				{
 | |
| 					if(m_Orientation==eOrientation.Vertical)
 | |
| 					{
 | |
| 						if(m_ButtonAlignment==eItemAlignment.Near)
 | |
| 							state=ThemeScrollBarStates.ArrowBtnUpHot;
 | |
| 						else
 | |
| 							state=ThemeScrollBarStates.ArrowBtnDownHot;
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						if(m_ButtonAlignment==eItemAlignment.Near)
 | |
| 							state=ThemeScrollBarStates.ArrowBtnLeftHot;
 | |
| 						else
 | |
| 							state=ThemeScrollBarStates.ArrowBtnRightHot;
 | |
| 					}
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					if(m_Orientation==eOrientation.Vertical)
 | |
| 					{
 | |
| 						if(m_ButtonAlignment==eItemAlignment.Near)
 | |
| 							state=ThemeScrollBarStates.ArrowBtnUpNormal;
 | |
| 						else
 | |
| 							state=ThemeScrollBarStates.ArrowBtnDownNormal;
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						if(m_ButtonAlignment==eItemAlignment.Near)
 | |
| 							state=ThemeScrollBarStates.ArrowBtnLeftNormal;
 | |
| 						else
 | |
| 							state=ThemeScrollBarStates.ArrowBtnRightNormal;
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				scroll.DrawBackground(g,part,state,this.DisplayRectangle);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				if(m_MouseDown)
 | |
| 					BarFunctions.DrawBorder3D(g,this.DisplayRectangle,System.Windows.Forms.Border3DStyle.SunkenInner);
 | |
| 				else
 | |
| 					BarFunctions.DrawBorder3D(g,this.DisplayRectangle,System.Windows.Forms.Border3DStyle.Raised);
 | |
| 
 | |
| 				if(m_Orientation==eOrientation.Vertical)
 | |
| 				{
 | |
| 					PaintArrow(g,this.DisplayRectangle,SystemColors.ControlText,(m_ButtonAlignment==eItemAlignment.Near));
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void PaintArrow(Graphics g, Rectangle rect, Color c, bool up)
 | |
| 		{
 | |
| 			Point[] p=new Point[3];
 | |
| 			if(up)
 | |
| 			{
 | |
| 				p[0].X=rect.Left+(rect.Width-9)/2;
 | |
| 				p[0].Y=rect.Top+rect.Height/2+1;
 | |
| 				p[1].X=p[0].X+8;
 | |
| 				p[1].Y=p[0].Y;
 | |
| 				p[2].X=p[0].X+4;
 | |
| 				p[2].Y=p[0].Y-5;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				p[0].X=rect.Left+(rect.Width-7)/2;
 | |
| 				p[0].Y=rect.Top+(rect.Height-4)/2;
 | |
| 				p[1].X=p[0].X+7;
 | |
| 				p[1].Y=p[0].Y;
 | |
| 				p[2].X=p[0].X+3;
 | |
| 				p[2].Y=p[0].Y+4;
 | |
| 			}
 | |
| 			g.FillPolygon(new SolidBrush(c),p);
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnMouseEnter(EventArgs e)
 | |
| 		{
 | |
| 			base.OnMouseEnter(e);
 | |
| 			if(!m_MouseOver)
 | |
| 			{
 | |
| 				m_MouseOver=true;
 | |
| 				this.Refresh();
 | |
| 			}
 | |
| 		}
 | |
| 		protected override void OnMouseLeave(EventArgs e)
 | |
| 		{
 | |
| 			base.OnMouseLeave(e);
 | |
| 			
 | |
| 			if(m_ScrollTimer!=null)
 | |
| 			{
 | |
| 				m_ScrollTimer.Stop();
 | |
| 				m_ScrollTimer.Dispose();
 | |
| 				m_ScrollTimer=null;
 | |
| 			}
 | |
| 
 | |
| 			if(m_MouseOver)
 | |
| 			{
 | |
| 				m_MouseOver=false;
 | |
| 				this.Refresh();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnMouseHover(EventArgs e)
 | |
| 		{
 | |
| 			base.OnMouseHover(e);
 | |
| 			if(UseTimer)
 | |
| 				SetupScrollTimer();
 | |
| 		}
 | |
| 
 | |
| 		public eOrientation Orientation
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				return m_Orientation;
 | |
| 			}
 | |
| 			set
 | |
| 			{
 | |
| 				if(m_Orientation!=value)
 | |
| 				{
 | |
| 					m_Orientation=value;
 | |
| 					this.Refresh();
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public eItemAlignment ButtonAlignment
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				return m_ButtonAlignment;
 | |
| 			}
 | |
| 			set
 | |
| 			{
 | |
| 				if(m_ButtonAlignment!=value)
 | |
| 				{
 | |
| 					m_ButtonAlignment=value;
 | |
| 					this.Refresh();
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void SetupScrollTimer()
 | |
| 		{
 | |
| 			if(m_ScrollTimer==null)
 | |
| 			{
 | |
| 				m_ScrollTimer=new Timer();
 | |
| 				m_ScrollTimer.Interval=200;
 | |
| 				m_ScrollTimer.Tick+=new EventHandler(this.ScrollTimerTick);
 | |
| 				m_ScrollTimer.Start();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void ScrollTimerTick(object sender, EventArgs e)
 | |
| 		{
 | |
| 			base.InvokeOnClick(this,new EventArgs());
 | |
| 		}
 | |
| 		
 | |
| 		/// <summary> 
 | |
| 		/// Clean up any resources being used.
 | |
| 		/// </summary>
 | |
| 		protected override void Dispose( bool disposing )
 | |
| 		{
 | |
| 			if(m_ScrollTimer!=null)
 | |
| 			{
 | |
| 				m_ScrollTimer.Stop();
 | |
| 				m_ScrollTimer.Dispose();
 | |
| 				m_ScrollTimer=null;
 | |
| 			}
 | |
| 			base.Dispose(disposing);
 | |
| 		}
 | |
| 
 | |
| 		private DevComponents.DotNetBar.ThemeScrollBar ThemeScrollBar
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				if(m_ThemeScrollBar==null)
 | |
| 					m_ThemeScrollBar=new ThemeScrollBar(this);
 | |
| 				return m_ThemeScrollBar;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnHandleDestroyed(EventArgs e)
 | |
| 		{
 | |
| 			DisposeThemes();
 | |
| 			base.OnHandleDestroyed(e);
 | |
| 		}
 | |
| 
 | |
| 		private void DisposeThemes()
 | |
| 		{
 | |
| 			if(m_ThemeScrollBar!=null)
 | |
| 			{
 | |
| 				m_ThemeScrollBar.Dispose();
 | |
| 				m_ThemeScrollBar=null;
 | |
| 			}
 | |
| 		}
 | |
| 		protected override void WndProc(ref Message m)
 | |
| 		{
 | |
| 			const int WM_MOUSEACTIVATE = 0x21;
 | |
| 			const int MA_NOACTIVATE = 3;
 | |
| 			if(m.Msg==NativeFunctions.WM_THEMECHANGED)
 | |
| 			{
 | |
| 				this.RefreshThemes();
 | |
| 			}
 | |
| 			else if(m.Msg==WM_MOUSEACTIVATE)
 | |
| 			{
 | |
| 				m.Result=new System.IntPtr(MA_NOACTIVATE);
 | |
| 				return;
 | |
| 			}
 | |
| 			base.WndProc(ref m);
 | |
| 		}
 | |
| 
 | |
| 		private void RefreshThemes()
 | |
| 		{
 | |
| 			if(m_ThemeScrollBar!=null)
 | |
| 			{
 | |
| 				m_ThemeScrollBar.Dispose();
 | |
| 				m_ThemeScrollBar=new ThemeScrollBar(this);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |