mirror of
https://github.com/Hofknecht/SystemTrayMenu.git
synced 2024-06-30 03:51:14 +12:00
[Feature] Custom Scrollbar (#183), version 1.0.17.60
This commit is contained in:
parent
e6f496a72e
commit
47ccdd7d21
|
@ -39,5 +39,5 @@ using System.Runtime.InteropServices;
|
||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.17.59")]
|
[assembly: AssemblyVersion("1.0.17.60")]
|
||||||
[assembly: AssemblyFileVersion("1.0.17.59")]
|
[assembly: AssemblyFileVersion("1.0.17.60")]
|
||||||
|
|
|
@ -15,24 +15,22 @@ namespace SystemTrayMenu.UserInterface
|
||||||
public class CustomScrollbar : UserControl
|
public class CustomScrollbar : UserControl
|
||||||
{
|
{
|
||||||
private readonly Timer timerMouseStillClicked = new Timer();
|
private readonly Timer timerMouseStillClicked = new Timer();
|
||||||
|
private float largeChange = 10;
|
||||||
private float moLargeChange = 10;
|
private float smallChange = 1;
|
||||||
private float moSmallChange = 1;
|
private int minimum = 0;
|
||||||
private int moMinimum = 0;
|
private int maximum = 100;
|
||||||
private int moMaximum = 100;
|
private int value = 0;
|
||||||
private int moValue = 0;
|
private int lastValue = 0;
|
||||||
private int nClickPoint;
|
private int clickPoint;
|
||||||
|
private float sliderTop = 0;
|
||||||
private float moSliderTop = 0;
|
private bool sliderDown = false;
|
||||||
private bool moSliderDown = false;
|
private bool sliderDragging = false;
|
||||||
private bool moSliderDragging = false;
|
|
||||||
private bool arrowUpHovered = false;
|
private bool arrowUpHovered = false;
|
||||||
private bool sliderHovered = false;
|
private bool sliderHovered = false;
|
||||||
private bool arrowDownHovered = false;
|
private bool arrowDownHovered = false;
|
||||||
private bool mouseStillClickedMoveUp = false;
|
private bool mouseStillClickedMoveUp = false;
|
||||||
private bool mouseStillClickedMoveLarge;
|
private bool mouseStillClickedMoveLarge = false;
|
||||||
private int timerMouseStillClickedCounter = 0;
|
private int timerMouseStillClickedCounter = 0;
|
||||||
private int lastValue = 0;
|
|
||||||
private bool paintEnabledWasCalled = false;
|
private bool paintEnabledWasCalled = false;
|
||||||
private bool paintEnabled = false;
|
private bool paintEnabled = false;
|
||||||
|
|
||||||
|
@ -42,26 +40,6 @@ namespace SystemTrayMenu.UserInterface
|
||||||
SetStyle(ControlStyles.ResizeRedraw, true);
|
SetStyle(ControlStyles.ResizeRedraw, true);
|
||||||
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
||||||
SetStyle(ControlStyles.DoubleBuffer, true);
|
SetStyle(ControlStyles.DoubleBuffer, true);
|
||||||
|
|
||||||
int GetScrollbarHeight()
|
|
||||||
{
|
|
||||||
int nTrackHeight = Height - (Width + Width);
|
|
||||||
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
|
|
||||||
int nSliderHeight = (int)fSliderHeight;
|
|
||||||
|
|
||||||
if (nSliderHeight > nTrackHeight)
|
|
||||||
{
|
|
||||||
nSliderHeight = nTrackHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nSliderHeight < 56)
|
|
||||||
{
|
|
||||||
nSliderHeight = 56;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nSliderHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
timerMouseStillClicked.Interval = 30;
|
timerMouseStillClicked.Interval = 30;
|
||||||
timerMouseStillClicked.Tick += TimerMouseStillClicked_Tick;
|
timerMouseStillClicked.Tick += TimerMouseStillClicked_Tick;
|
||||||
}
|
}
|
||||||
|
@ -79,12 +57,12 @@ namespace SystemTrayMenu.UserInterface
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return moLargeChange;
|
return largeChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
moLargeChange = value;
|
largeChange = value;
|
||||||
Invalidate();
|
Invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,12 +76,12 @@ namespace SystemTrayMenu.UserInterface
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return moSmallChange;
|
return smallChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
moSmallChange = value;
|
smallChange = value;
|
||||||
Invalidate();
|
Invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,12 +95,12 @@ namespace SystemTrayMenu.UserInterface
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return moMinimum;
|
return minimum;
|
||||||
}
|
}
|
||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
moMinimum = value;
|
minimum = value;
|
||||||
Invalidate();
|
Invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -136,12 +114,12 @@ namespace SystemTrayMenu.UserInterface
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return moMaximum;
|
return maximum;
|
||||||
}
|
}
|
||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
moMaximum = value;
|
maximum = value;
|
||||||
Invalidate();
|
Invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -155,37 +133,24 @@ namespace SystemTrayMenu.UserInterface
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return moValue;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
moValue = value;
|
this.value = value;
|
||||||
int nTrackHeight = Height - (Width + Width);
|
int trackHeight = GetTrackHeight();
|
||||||
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
|
int sliderHeight = GetSliderHeight(trackHeight);
|
||||||
int nSliderHeight = (int)fSliderHeight;
|
int pixelRange = trackHeight - sliderHeight;
|
||||||
if (nSliderHeight > nTrackHeight)
|
int realRange = Maximum - Minimum - (int)LargeChange;
|
||||||
|
float percentage = 0.0f;
|
||||||
|
if (realRange != 0)
|
||||||
{
|
{
|
||||||
nSliderHeight = nTrackHeight;
|
percentage = this.value / (float)realRange;
|
||||||
fSliderHeight = nTrackHeight;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nSliderHeight < 56)
|
float top = percentage * pixelRange;
|
||||||
{
|
sliderTop = (int)top;
|
||||||
nSliderHeight = 56;
|
|
||||||
fSliderHeight = 56;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nPixelRange = nTrackHeight - nSliderHeight;
|
|
||||||
int nRealRange = Maximum - Minimum - (int)LargeChange;
|
|
||||||
float fPerc = 0.0f;
|
|
||||||
if (nRealRange != 0)
|
|
||||||
{
|
|
||||||
fPerc = moValue / (float)nRealRange;
|
|
||||||
}
|
|
||||||
|
|
||||||
float fTop = fPerc * nPixelRange;
|
|
||||||
moSliderTop = (int)fTop;
|
|
||||||
Invalidate();
|
Invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,10 +173,6 @@ namespace SystemTrayMenu.UserInterface
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
base.AutoSize = value;
|
base.AutoSize = value;
|
||||||
if (base.AutoSize)
|
|
||||||
{
|
|
||||||
Width = Width;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,9 +190,9 @@ namespace SystemTrayMenu.UserInterface
|
||||||
|
|
||||||
internal void Reset()
|
internal void Reset()
|
||||||
{
|
{
|
||||||
moSliderTop = 0;
|
sliderTop = 0;
|
||||||
moSliderDown = false;
|
sliderDown = false;
|
||||||
moSliderDragging = false;
|
sliderDragging = false;
|
||||||
arrowUpHovered = false;
|
arrowUpHovered = false;
|
||||||
sliderHovered = false;
|
sliderHovered = false;
|
||||||
arrowDownHovered = false;
|
arrowDownHovered = false;
|
||||||
|
@ -284,6 +245,7 @@ namespace SystemTrayMenu.UserInterface
|
||||||
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
|
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
|
||||||
|
|
||||||
Color colorArrows;
|
Color colorArrows;
|
||||||
|
Color colorArrowsHoverBackground;
|
||||||
Color colorArrowsHover;
|
Color colorArrowsHover;
|
||||||
Color colorSlider;
|
Color colorSlider;
|
||||||
Color colorSliderHover;
|
Color colorSliderHover;
|
||||||
|
@ -292,7 +254,8 @@ namespace SystemTrayMenu.UserInterface
|
||||||
if (Config.IsDarkMode())
|
if (Config.IsDarkMode())
|
||||||
{
|
{
|
||||||
colorArrows = Color.FromArgb(103, 103, 103);
|
colorArrows = Color.FromArgb(103, 103, 103);
|
||||||
colorArrowsHover = Color.FromArgb(55, 55, 55);
|
colorArrowsHoverBackground = Color.FromArgb(55, 55, 55);
|
||||||
|
colorArrowsHover = Color.FromArgb(103, 103, 103);
|
||||||
colorSlider = Color.FromArgb(77, 77, 77);
|
colorSlider = Color.FromArgb(77, 77, 77);
|
||||||
colorSliderHover = Color.FromArgb(122, 122, 122);
|
colorSliderHover = Color.FromArgb(122, 122, 122);
|
||||||
colorSliderDragging = Color.FromArgb(166, 166, 166);
|
colorSliderDragging = Color.FromArgb(166, 166, 166);
|
||||||
|
@ -301,6 +264,7 @@ namespace SystemTrayMenu.UserInterface
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
colorArrows = Color.FromArgb(96, 96, 96);
|
colorArrows = Color.FromArgb(96, 96, 96);
|
||||||
|
colorArrowsHoverBackground = Color.FromArgb(218, 218, 218);
|
||||||
colorArrowsHover = Color.FromArgb(0, 0, 0);
|
colorArrowsHover = Color.FromArgb(0, 0, 0);
|
||||||
colorSlider = Color.FromArgb(205, 205, 205);
|
colorSlider = Color.FromArgb(205, 205, 205);
|
||||||
colorSliderHover = Color.FromArgb(166, 166, 166);
|
colorSliderHover = Color.FromArgb(166, 166, 166);
|
||||||
|
@ -316,21 +280,30 @@ namespace SystemTrayMenu.UserInterface
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int trackHeight = GetTrackHeight();
|
||||||
|
int sliderHeight = GetSliderHeight(trackHeight);
|
||||||
|
int top = (int)sliderTop + Width;
|
||||||
|
|
||||||
// Draw background
|
// Draw background
|
||||||
Brush brushScrollbarBorder = new SolidBrush(colorBackground);
|
Brush brushScrollbarBorder = new SolidBrush(colorBackground);
|
||||||
e.Graphics.FillRectangle(brushScrollbarBorder, new Rectangle(0, 0, Width, Height));
|
e.Graphics.FillRectangle(brushScrollbarBorder, new Rectangle(0, 0, Width, Height));
|
||||||
|
|
||||||
// Draw arrowUp
|
// Draw arrowUp
|
||||||
|
SolidBrush solidBrushArrowUp;
|
||||||
Pen penArrowUp;
|
Pen penArrowUp;
|
||||||
if (arrowUpHovered)
|
if (arrowUpHovered)
|
||||||
{
|
{
|
||||||
|
solidBrushArrowUp = new SolidBrush(colorArrowsHoverBackground);
|
||||||
penArrowUp = new Pen(colorArrowsHover, 2.5F);
|
penArrowUp = new Pen(colorArrowsHover, 2.5F);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
solidBrushArrowUp = new SolidBrush(colorBackground);
|
||||||
penArrowUp = new Pen(colorArrows, 2.5F);
|
penArrowUp = new Pen(colorArrows, 2.5F);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e.Graphics.FillRectangle(solidBrushArrowUp, GetUpArrowRectangleWithoutBorder());
|
||||||
|
|
||||||
int widthDevidedBy2 = Width / 2;
|
int widthDevidedBy2 = Width / 2;
|
||||||
int widthDevidedBy6 = Width / 6;
|
int widthDevidedBy6 = Width / 6;
|
||||||
int widthDevidedBy2PluswidthDevidedBy8 = widthDevidedBy2 + (Width / 8);
|
int widthDevidedBy2PluswidthDevidedBy8 = widthDevidedBy2 + (Width / 8);
|
||||||
|
@ -348,25 +321,8 @@ namespace SystemTrayMenu.UserInterface
|
||||||
e.Graphics.DrawPolygon(penArrowUp, curvePoints);
|
e.Graphics.DrawPolygon(penArrowUp, curvePoints);
|
||||||
|
|
||||||
// draw slider
|
// draw slider
|
||||||
int nTrackHeight = Height - (Width * 2);
|
|
||||||
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
|
|
||||||
int nSliderHeight = (int)fSliderHeight;
|
|
||||||
|
|
||||||
if (nSliderHeight > nTrackHeight)
|
|
||||||
{
|
|
||||||
nSliderHeight = nTrackHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nSliderHeight < 56)
|
|
||||||
{
|
|
||||||
nSliderHeight = 56;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nTop = (int)moSliderTop;
|
|
||||||
nTop += this.Width;
|
|
||||||
|
|
||||||
SolidBrush solidBrushSlider;
|
SolidBrush solidBrushSlider;
|
||||||
if (moSliderDragging)
|
if (sliderDragging)
|
||||||
{
|
{
|
||||||
solidBrushSlider = new SolidBrush(colorSliderDragging);
|
solidBrushSlider = new SolidBrush(colorSliderDragging);
|
||||||
}
|
}
|
||||||
|
@ -379,20 +335,25 @@ namespace SystemTrayMenu.UserInterface
|
||||||
solidBrushSlider = new SolidBrush(colorSlider);
|
solidBrushSlider = new SolidBrush(colorSlider);
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle rectangleSlider = new Rectangle(1, nTop + 1, Width - 2, nSliderHeight - 1);
|
Rectangle rectangleSlider = new Rectangle(1, top, Width - 2, sliderHeight);
|
||||||
e.Graphics.FillRectangle(solidBrushSlider, rectangleSlider);
|
e.Graphics.FillRectangle(solidBrushSlider, rectangleSlider);
|
||||||
|
|
||||||
// Draw arrowDown
|
// Draw arrowDown
|
||||||
|
SolidBrush solidBrushArrowDown;
|
||||||
Pen penArrowDown;
|
Pen penArrowDown;
|
||||||
if (arrowDownHovered)
|
if (arrowDownHovered)
|
||||||
{
|
{
|
||||||
|
solidBrushArrowDown = new SolidBrush(colorArrowsHoverBackground);
|
||||||
penArrowDown = new Pen(colorArrowsHover, 2.5F);
|
penArrowDown = new Pen(colorArrowsHover, 2.5F);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
solidBrushArrowDown = new SolidBrush(colorBackground);
|
||||||
penArrowDown = new Pen(colorArrows, 2.5F);
|
penArrowDown = new Pen(colorArrows, 2.5F);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e.Graphics.FillRectangle(solidBrushArrowDown, GetDownArrowRectangleWithoutBorder(trackHeight));
|
||||||
|
|
||||||
PointF pointArrowDown1 = new PointF(widthDevidedBy2 - widthDevidedBy6, Height - widthDevidedBy2PluswidthDevidedBy8);
|
PointF pointArrowDown1 = new PointF(widthDevidedBy2 - widthDevidedBy6, Height - widthDevidedBy2PluswidthDevidedBy8);
|
||||||
PointF pointArrowDown2 = new PointF(widthDevidedBy2 + widthDevidedBy6, Height - widthDevidedBy2PluswidthDevidedBy8);
|
PointF pointArrowDown2 = new PointF(widthDevidedBy2 + widthDevidedBy6, Height - widthDevidedBy2PluswidthDevidedBy8);
|
||||||
PointF pointArrowDown3 = new PointF(widthDevidedBy2, Height - widthDevidedBy2PluswidthDevidedBy8 + widthDevidedBy6);
|
PointF pointArrowDown3 = new PointF(widthDevidedBy2, Height - widthDevidedBy2PluswidthDevidedBy8 + widthDevidedBy6);
|
||||||
|
@ -412,25 +373,13 @@ namespace SystemTrayMenu.UserInterface
|
||||||
{
|
{
|
||||||
timerMouseStillClickedCounter++;
|
timerMouseStillClickedCounter++;
|
||||||
|
|
||||||
int nTrackHeight = Height - (Width + Width);
|
Point pointCursor = PointToClient(Cursor.Position);
|
||||||
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
|
int trackHeight = GetTrackHeight();
|
||||||
int nScrollbarHeight = (int)fSliderHeight;
|
int sliderHeight = GetSliderHeight(trackHeight);
|
||||||
|
int top = (int)sliderTop + Width;
|
||||||
|
|
||||||
if (nScrollbarHeight > nTrackHeight)
|
Rectangle sliderRectangle = GetSliderRectangle(sliderHeight, top);
|
||||||
{
|
if (sliderRectangle.Contains(pointCursor))
|
||||||
nScrollbarHeight = nTrackHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nScrollbarHeight < 56)
|
|
||||||
{
|
|
||||||
nScrollbarHeight = 56;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nTop = (int)moSliderTop;
|
|
||||||
nTop += Width;
|
|
||||||
Point ptPoint = PointToClient(Cursor.Position);
|
|
||||||
Rectangle thumbrect = new Rectangle(new Point(0, nTop), new Size(Width + 1, nScrollbarHeight));
|
|
||||||
if (thumbrect.Contains(ptPoint))
|
|
||||||
{
|
{
|
||||||
timerMouseStillClicked.Stop();
|
timerMouseStillClicked.Stop();
|
||||||
}
|
}
|
||||||
|
@ -465,8 +414,6 @@ namespace SystemTrayMenu.UserInterface
|
||||||
MouseMove += CustomScrollbar_MouseMove;
|
MouseMove += CustomScrollbar_MouseMove;
|
||||||
MouseUp += CustomScrollbar_MouseUp;
|
MouseUp += CustomScrollbar_MouseUp;
|
||||||
MouseLeave += CustomScrollbar_MouseLeave;
|
MouseLeave += CustomScrollbar_MouseLeave;
|
||||||
|
|
||||||
// this.MouseWheel += CustomScrollbar_MouseWheel;
|
|
||||||
ResumeLayout(false);
|
ResumeLayout(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -480,34 +427,21 @@ namespace SystemTrayMenu.UserInterface
|
||||||
|
|
||||||
private void CustomScrollbar_MouseDown(object sender, MouseEventArgs e)
|
private void CustomScrollbar_MouseDown(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
Point ptPoint = PointToClient(Cursor.Position);
|
Point pointCursor = PointToClient(Cursor.Position);
|
||||||
int nTrackHeight = Height - (Width + Width);
|
int trackHeight = GetTrackHeight();
|
||||||
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
|
int sliderHeight = GetSliderHeight(trackHeight);
|
||||||
int nScrollbarHeight = (int)fSliderHeight;
|
int top = (int)sliderTop + Width;
|
||||||
|
|
||||||
if (nScrollbarHeight > nTrackHeight)
|
Rectangle sliderRectangle = GetSliderRectangle(sliderHeight, top);
|
||||||
|
Rectangle trackRectangle = GetTrackRectangle(trackHeight);
|
||||||
|
if (sliderRectangle.Contains(pointCursor))
|
||||||
{
|
{
|
||||||
nScrollbarHeight = nTrackHeight;
|
clickPoint = pointCursor.Y - top;
|
||||||
|
sliderDown = true;
|
||||||
}
|
}
|
||||||
|
else if (trackRectangle.Contains(pointCursor))
|
||||||
if (nScrollbarHeight < 56)
|
|
||||||
{
|
{
|
||||||
nScrollbarHeight = 56;
|
if (e.Y < sliderRectangle.Y)
|
||||||
}
|
|
||||||
|
|
||||||
int nTop = (int)moSliderTop;
|
|
||||||
nTop += Width;
|
|
||||||
|
|
||||||
Rectangle thumbrect = new Rectangle(new Point(0, nTop), new Size(Width + 1, nScrollbarHeight));
|
|
||||||
Rectangle trackRectangle = new Rectangle(new Point(0, Width), new Size(Width + 1, nTrackHeight));
|
|
||||||
if (thumbrect.Contains(ptPoint))
|
|
||||||
{
|
|
||||||
nClickPoint = ptPoint.Y - nTop;
|
|
||||||
moSliderDown = true;
|
|
||||||
}
|
|
||||||
else if (trackRectangle.Contains(ptPoint))
|
|
||||||
{
|
|
||||||
if (e.Y < thumbrect.Y)
|
|
||||||
{
|
{
|
||||||
MoveUp(Height);
|
MoveUp(Height);
|
||||||
mouseStillClickedMoveUp = true;
|
mouseStillClickedMoveUp = true;
|
||||||
|
@ -523,8 +457,8 @@ namespace SystemTrayMenu.UserInterface
|
||||||
timerMouseStillClicked.Start();
|
timerMouseStillClicked.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle uparrowrect = new Rectangle(new Point(0, 0), new Size(Width + 1, Width));
|
Rectangle upArrowRectangle = GetUpArrowRectangle();
|
||||||
if (uparrowrect.Contains(ptPoint))
|
if (upArrowRectangle.Contains(pointCursor))
|
||||||
{
|
{
|
||||||
MoveUp(SmallChange);
|
MoveUp(SmallChange);
|
||||||
mouseStillClickedMoveUp = true;
|
mouseStillClickedMoveUp = true;
|
||||||
|
@ -533,8 +467,8 @@ namespace SystemTrayMenu.UserInterface
|
||||||
timerMouseStillClicked.Start();
|
timerMouseStillClicked.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle downarrowrect = new Rectangle(new Point(0, Width + nTrackHeight), new Size(Width + 1, Width));
|
Rectangle downArrowRectangle = GetDownArrowRectangle(trackHeight);
|
||||||
if (downarrowrect.Contains(ptPoint))
|
if (downArrowRectangle.Contains(pointCursor))
|
||||||
{
|
{
|
||||||
MoveDown(SmallChange);
|
MoveDown(SmallChange);
|
||||||
mouseStillClickedMoveUp = false;
|
mouseStillClickedMoveUp = false;
|
||||||
|
@ -546,44 +480,26 @@ namespace SystemTrayMenu.UserInterface
|
||||||
|
|
||||||
private void MoveDown(float change)
|
private void MoveDown(float change)
|
||||||
{
|
{
|
||||||
int nTrackHeight = Height - (Width + Width);
|
int trackHeight = GetTrackHeight();
|
||||||
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
|
int sliderHeight = GetSliderHeight(trackHeight);
|
||||||
int nSliderHeight = (int)fSliderHeight;
|
int realRange = Maximum - Minimum - (int)LargeChange;
|
||||||
|
int pixelRange = trackHeight - sliderHeight;
|
||||||
|
if (realRange > 0)
|
||||||
|
{
|
||||||
|
if (pixelRange > 0)
|
||||||
|
{
|
||||||
|
float changeForOneItem = (change * pixelRange) / (Maximum - LargeChange);
|
||||||
|
|
||||||
if (nSliderHeight > nTrackHeight)
|
if ((sliderTop + changeForOneItem) > pixelRange)
|
||||||
{
|
{
|
||||||
nSliderHeight = nTrackHeight;
|
sliderTop = pixelRange;
|
||||||
fSliderHeight = nTrackHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nSliderHeight < 56)
|
|
||||||
{
|
|
||||||
nSliderHeight = 56;
|
|
||||||
fSliderHeight = 56;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nRealRange = Maximum - Minimum - (int)LargeChange;
|
|
||||||
int nPixelRange = nTrackHeight - nSliderHeight;
|
|
||||||
if (nRealRange > 0)
|
|
||||||
{
|
|
||||||
if (nPixelRange > 0)
|
|
||||||
{
|
|
||||||
float changeForOneItem = (change * nPixelRange) / (Maximum - LargeChange);
|
|
||||||
|
|
||||||
if ((moSliderTop + changeForOneItem) > nPixelRange)
|
|
||||||
{
|
|
||||||
moSliderTop = nPixelRange;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
moSliderTop += changeForOneItem;
|
sliderTop += changeForOneItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
// figure out value
|
CalculateValue(pixelRange);
|
||||||
float fPerc = moSliderTop / nPixelRange;
|
|
||||||
float fValue = fPerc * (Maximum - LargeChange);
|
|
||||||
|
|
||||||
moValue = (int)fValue;
|
|
||||||
|
|
||||||
if (Value != lastValue)
|
if (Value != lastValue)
|
||||||
{
|
{
|
||||||
|
@ -599,44 +515,26 @@ namespace SystemTrayMenu.UserInterface
|
||||||
|
|
||||||
private void MoveUp(float change)
|
private void MoveUp(float change)
|
||||||
{
|
{
|
||||||
int nTrackHeight = Height - (Width + Width);
|
int trackHeight = GetTrackHeight();
|
||||||
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
|
int sliderHeight = GetSliderHeight(trackHeight);
|
||||||
int nSliderHeight = (int)fSliderHeight;
|
int realRange = Maximum - Minimum - (int)LargeChange;
|
||||||
|
int pixelRange = trackHeight - sliderHeight;
|
||||||
|
if (realRange > 0)
|
||||||
|
{
|
||||||
|
if (pixelRange > 0)
|
||||||
|
{
|
||||||
|
float changeForOneItem = (change * pixelRange) / (Maximum - LargeChange);
|
||||||
|
|
||||||
if (nSliderHeight > nTrackHeight)
|
if ((sliderTop - changeForOneItem) < 0)
|
||||||
{
|
{
|
||||||
nSliderHeight = nTrackHeight;
|
sliderTop = 0;
|
||||||
fSliderHeight = nTrackHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nSliderHeight < 56)
|
|
||||||
{
|
|
||||||
nSliderHeight = 56;
|
|
||||||
fSliderHeight = 56;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nRealRange = Maximum - Minimum - (int)LargeChange;
|
|
||||||
int nPixelRange = nTrackHeight - nSliderHeight;
|
|
||||||
if (nRealRange > 0)
|
|
||||||
{
|
|
||||||
if (nPixelRange > 0)
|
|
||||||
{
|
|
||||||
float changeForOneItem = (change * nPixelRange) / (Maximum - LargeChange);
|
|
||||||
|
|
||||||
if ((moSliderTop - changeForOneItem) < 0)
|
|
||||||
{
|
|
||||||
moSliderTop = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
moSliderTop -= changeForOneItem;
|
sliderTop -= changeForOneItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
// figure out value
|
CalculateValue(pixelRange);
|
||||||
float fPerc = moSliderTop / nPixelRange;
|
|
||||||
float fValue = fPerc * (Maximum - LargeChange);
|
|
||||||
|
|
||||||
moValue = (int)fValue;
|
|
||||||
|
|
||||||
if (Value != lastValue)
|
if (Value != lastValue)
|
||||||
{
|
{
|
||||||
|
@ -652,19 +550,19 @@ namespace SystemTrayMenu.UserInterface
|
||||||
|
|
||||||
private void CustomScrollbar_MouseUp(object sender, MouseEventArgs e)
|
private void CustomScrollbar_MouseUp(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
moSliderDown = false;
|
sliderDown = false;
|
||||||
moSliderDragging = false;
|
sliderDragging = false;
|
||||||
timerMouseStillClicked.Stop();
|
timerMouseStillClicked.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CustomScrollbar_MouseMove(object sender, MouseEventArgs e)
|
private void CustomScrollbar_MouseMove(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
if (moSliderDown == true)
|
if (sliderDown == true)
|
||||||
{
|
{
|
||||||
moSliderDragging = true;
|
sliderDragging = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (moSliderDragging)
|
if (sliderDragging)
|
||||||
{
|
{
|
||||||
MoveSlider(e.Y);
|
MoveSlider(e.Y);
|
||||||
}
|
}
|
||||||
|
@ -676,28 +574,14 @@ namespace SystemTrayMenu.UserInterface
|
||||||
lastValue = Value;
|
lastValue = Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remember hovered control
|
Point pointCursor = PointToClient(Cursor.Position);
|
||||||
Point ptPoint = PointToClient(Cursor.Position);
|
int trackHeight = GetTrackHeight();
|
||||||
int nTrackHeight = Height - (Width + Width);
|
int sliderHeight = GetSliderHeight(trackHeight);
|
||||||
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
|
int top = (int)sliderTop + Width;
|
||||||
int nSliderHeight = (int)fSliderHeight;
|
|
||||||
|
|
||||||
if (nSliderHeight > nTrackHeight)
|
Rectangle sliderRectangle = GetSliderRectangle(sliderHeight, top);
|
||||||
{
|
Rectangle trackRectangle = GetTrackRectangle(trackHeight);
|
||||||
nSliderHeight = nTrackHeight;
|
if (sliderRectangle.Contains(pointCursor))
|
||||||
}
|
|
||||||
|
|
||||||
if (nSliderHeight < 56)
|
|
||||||
{
|
|
||||||
nSliderHeight = 56;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nTop = (int)moSliderTop;
|
|
||||||
nTop += Width;
|
|
||||||
|
|
||||||
Rectangle scrollbarbrect = new Rectangle(new Point(0, nTop), new Size(Width + 1, nSliderHeight));
|
|
||||||
Rectangle trackRectangle = new Rectangle(new Point(0, Width), new Size(Width + 1, nTrackHeight));
|
|
||||||
if (scrollbarbrect.Contains(ptPoint))
|
|
||||||
{
|
{
|
||||||
if (e.Button != MouseButtons.Left)
|
if (e.Button != MouseButtons.Left)
|
||||||
{
|
{
|
||||||
|
@ -706,9 +590,9 @@ namespace SystemTrayMenu.UserInterface
|
||||||
arrowDownHovered = false;
|
arrowDownHovered = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (trackRectangle.Contains(ptPoint))
|
else if (trackRectangle.Contains(pointCursor))
|
||||||
{
|
{
|
||||||
if (e.Y < scrollbarbrect.Y)
|
if (e.Y < sliderRectangle.Y)
|
||||||
{
|
{
|
||||||
arrowUpHovered = false;
|
arrowUpHovered = false;
|
||||||
sliderHovered = false;
|
sliderHovered = false;
|
||||||
|
@ -722,21 +606,27 @@ namespace SystemTrayMenu.UserInterface
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle uparrowrect = new Rectangle(new Point(0, 0), new Size(Width + 1, Width));
|
Rectangle upArrowRectangle = GetUpArrowRectangle();
|
||||||
if (uparrowrect.Contains(ptPoint))
|
if (upArrowRectangle.Contains(pointCursor))
|
||||||
|
{
|
||||||
|
if (e.Button != MouseButtons.Left)
|
||||||
{
|
{
|
||||||
arrowUpHovered = true;
|
arrowUpHovered = true;
|
||||||
sliderHovered = false;
|
sliderHovered = false;
|
||||||
arrowDownHovered = false;
|
arrowDownHovered = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Rectangle downarrowrect = new Rectangle(new Point(0, Width + nTrackHeight), new Size(Width + 1, Width));
|
Rectangle downArrowRectangle = GetDownArrowRectangle(trackHeight);
|
||||||
if (downarrowrect.Contains(ptPoint))
|
if (downArrowRectangle.Contains(pointCursor))
|
||||||
|
{
|
||||||
|
if (e.Button != MouseButtons.Left)
|
||||||
{
|
{
|
||||||
arrowUpHovered = false;
|
arrowUpHovered = false;
|
||||||
sliderHovered = false;
|
sliderHovered = false;
|
||||||
arrowDownHovered = true;
|
arrowDownHovered = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Invalidate();
|
Invalidate();
|
||||||
}
|
}
|
||||||
|
@ -744,52 +634,93 @@ namespace SystemTrayMenu.UserInterface
|
||||||
private void MoveSlider(int y)
|
private void MoveSlider(int y)
|
||||||
{
|
{
|
||||||
int nRealRange = Maximum - Minimum;
|
int nRealRange = Maximum - Minimum;
|
||||||
int nTrackHeight = Height - (Width + Width);
|
int trackHeight = GetTrackHeight();
|
||||||
float fSliderHeight = (float)LargeChange / Maximum * nTrackHeight;
|
int sliderHeight = GetSliderHeight(trackHeight);
|
||||||
int nSliderHeight = (int)fSliderHeight;
|
int spot = clickPoint;
|
||||||
|
int pixelRange = trackHeight - sliderHeight;
|
||||||
if (nSliderHeight > nTrackHeight)
|
if (sliderDown && nRealRange > 0)
|
||||||
{
|
{
|
||||||
nSliderHeight = nTrackHeight;
|
if (pixelRange > 0)
|
||||||
|
{
|
||||||
|
int newSliderTop = y - (Width + spot);
|
||||||
|
|
||||||
|
if (newSliderTop < 0)
|
||||||
|
{
|
||||||
|
sliderTop = 0;
|
||||||
}
|
}
|
||||||
|
else if (newSliderTop > pixelRange)
|
||||||
if (nSliderHeight < 56)
|
|
||||||
{
|
{
|
||||||
nSliderHeight = 56;
|
sliderTop = pixelRange;
|
||||||
}
|
|
||||||
|
|
||||||
int nSpot = nClickPoint;
|
|
||||||
|
|
||||||
int nPixelRange = nTrackHeight - nSliderHeight;
|
|
||||||
if (moSliderDown && nRealRange > 0)
|
|
||||||
{
|
|
||||||
if (nPixelRange > 0)
|
|
||||||
{
|
|
||||||
int nNewSliderTop = y - (Width + nSpot);
|
|
||||||
|
|
||||||
if (nNewSliderTop < 0)
|
|
||||||
{
|
|
||||||
moSliderTop = nNewSliderTop = 0;
|
|
||||||
}
|
|
||||||
else if (nNewSliderTop > nPixelRange)
|
|
||||||
{
|
|
||||||
moSliderTop = nNewSliderTop = nPixelRange;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
moSliderTop = y - (Width + nSpot);
|
sliderTop = y - (Width + spot);
|
||||||
}
|
}
|
||||||
|
|
||||||
// figure out value
|
CalculateValue(pixelRange);
|
||||||
float fPerc = moSliderTop / nPixelRange;
|
|
||||||
float fValue = fPerc * (Maximum - LargeChange);
|
|
||||||
moValue = (int)fValue;
|
|
||||||
|
|
||||||
Application.DoEvents();
|
|
||||||
|
|
||||||
Invalidate();
|
Invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CalculateValue(int pixelRange)
|
||||||
|
{
|
||||||
|
float percentage = sliderTop / pixelRange;
|
||||||
|
float fValue = percentage * (Maximum - LargeChange);
|
||||||
|
value = (int)fValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Rectangle GetSliderRectangle(int sliderHeight, int top)
|
||||||
|
{
|
||||||
|
return new Rectangle(new Point(0, top), new Size(Width + 1, sliderHeight));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Rectangle GetUpArrowRectangle()
|
||||||
|
{
|
||||||
|
return new Rectangle(new Point(0, 0), new Size(Width + 1, Width));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Rectangle GetUpArrowRectangleWithoutBorder()
|
||||||
|
{
|
||||||
|
return new Rectangle(new Point(1, 0), new Size(Width - 2, Width));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Rectangle GetDownArrowRectangle(int trackHeight)
|
||||||
|
{
|
||||||
|
return new Rectangle(new Point(0, Width + trackHeight), new Size(Width + 1, Width));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Rectangle GetDownArrowRectangleWithoutBorder(int trackHeight)
|
||||||
|
{
|
||||||
|
return new Rectangle(new Point(1, Width + trackHeight), new Size(Width - 2, Width));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Rectangle GetTrackRectangle(int trackHeight)
|
||||||
|
{
|
||||||
|
return new Rectangle(new Point(0, Width), new Size(Width + 1, trackHeight));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GetTrackHeight()
|
||||||
|
{
|
||||||
|
return Height - (Width + Width);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GetSliderHeight(int trackHeight)
|
||||||
|
{
|
||||||
|
int sliderHeight = (int)((float)LargeChange / Maximum * trackHeight);
|
||||||
|
|
||||||
|
if (sliderHeight > trackHeight)
|
||||||
|
{
|
||||||
|
sliderHeight = trackHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sliderHeight < 56)
|
||||||
|
{
|
||||||
|
sliderHeight = 56;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sliderHeight;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue