using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data; using System.Windows.Forms; namespace DevComponents.DotNetBar { /// /// Summary description for ScrollButton. /// [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()); } /// /// Clean up any resources being used. /// 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); } } } }