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);
|
|
}
|
|
}
|
|
}
|
|
}
|