#region Imports
|
|
using DPumpHydr.WinFrmUI.RLT.Colors;
|
using DPumpHydr.WinFrmUI.RLT.Util;
|
using System;
|
using System.ComponentModel;
|
using System.Drawing;
|
using System.Drawing.Drawing2D;
|
using System.Drawing.Text;
|
using System.Windows.Forms;
|
|
#endregion
|
|
namespace DPumpHydr.WinFrmUI.RLT.Controls
|
{
|
#region ForeverButtonSticky
|
|
public class ForeverButtonSticky : Control
|
{
|
private int W;
|
private int H;
|
private MouseStateForever State = MouseStateForever.None;
|
|
protected override void OnMouseDown(MouseEventArgs e)
|
{
|
base.OnMouseDown(e);
|
State = MouseStateForever.Down;
|
Invalidate();
|
}
|
|
protected override void OnMouseUp(MouseEventArgs e)
|
{
|
base.OnMouseUp(e);
|
State = MouseStateForever.Over;
|
Invalidate();
|
}
|
|
protected override void OnMouseEnter(EventArgs e)
|
{
|
base.OnMouseEnter(e);
|
State = MouseStateForever.Over;
|
Invalidate();
|
}
|
|
protected override void OnMouseLeave(EventArgs e)
|
{
|
base.OnMouseLeave(e);
|
State = MouseStateForever.None;
|
Invalidate();
|
}
|
|
private bool[] GetConnectedSides()
|
{
|
bool[] Bool = new bool[4] { false, false, false, false };
|
|
foreach (Control B in Parent.Controls)
|
{
|
if (B is ForeverButtonSticky)
|
{
|
if (object.ReferenceEquals(B, this) || !Rect.IntersectsWith(Rect))
|
{
|
continue;
|
}
|
|
double A = Math.Atan2(Left - B.Left, Top - B.Top) * 2 / Math.PI;
|
if (A / 1 == A)
|
{
|
Bool[(int)A + 1] = true;
|
}
|
}
|
}
|
|
return Bool;
|
}
|
|
private Rectangle Rect => new(Left, Top, Width, Height);
|
|
[Category("Colors")]
|
public Color BaseColor { get; set; } = ForeverLibrary.ForeverColor;
|
|
[Category("Colors")]
|
public Color TextColor { get; set; } = Color.FromArgb(243, 243, 243);
|
|
[Category("Options")]
|
public bool Rounded { get; set; } = false;
|
|
protected override void OnResize(EventArgs e)
|
{
|
base.OnResize(e);
|
//Height = 32
|
}
|
|
protected override void OnCreateControl()
|
{
|
base.OnCreateControl();
|
//Size = new(112, 32)
|
}
|
|
public ForeverButtonSticky()
|
{
|
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer | ControlStyles.SupportsTransparentBackColor, true);
|
DoubleBuffered = true;
|
Size = new(160, 40);
|
BackColor = Color.Transparent;
|
Font = new("Segoe UI", 12);
|
Cursor = Cursors.Hand;
|
}
|
|
protected override void OnPaint(PaintEventArgs e)
|
{
|
//UpdateColors();
|
|
Bitmap B = new(Width, Height);
|
Graphics G = Graphics.FromImage(B);
|
W = Width;
|
H = Height;
|
|
GraphicsPath GP = new();
|
|
bool[] GCS = GetConnectedSides();
|
// dynamic RoundedBase = ForeverLibrary.RoundRect(0, 0, W, H, ???, !(GCS(2) | GCS(1)), !(GCS(1) | GCS(0)), !(GCS(3) | GCS(0)), !(GCS(3) | GCS(2)));
|
GraphicsPath RoundedBase = ForeverLibrary.RoundRect(0, 0, W, H, 0.3, !(GCS[2] || GCS[1]), !(GCS[1] || GCS[0]), !(GCS[3] || GCS[0]), !(GCS[3] || GCS[2]));
|
Rectangle Base = new(0, 0, W, H);
|
|
Graphics _with17 = G;
|
_with17.SmoothingMode = SmoothingMode.HighQuality;
|
_with17.PixelOffsetMode = PixelOffsetMode.HighQuality;
|
_with17.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
|
_with17.Clear(BackColor);
|
|
switch (State)
|
{
|
case MouseStateForever.None:
|
if (Rounded)
|
{
|
//-- Base
|
GP = RoundedBase;
|
_with17.FillPath(new SolidBrush(BaseColor), GP);
|
|
//-- Text
|
_with17.DrawString(Text, Font, new SolidBrush(TextColor), Base, ForeverLibrary.CenterSF);
|
}
|
else
|
{
|
//-- Base
|
_with17.FillRectangle(new SolidBrush(BaseColor), Base);
|
|
//-- Text
|
_with17.DrawString(Text, Font, new SolidBrush(TextColor), Base, ForeverLibrary.CenterSF);
|
}
|
break;
|
case MouseStateForever.Over:
|
if (Rounded)
|
{
|
//-- Base
|
GP = RoundedBase;
|
_with17.FillPath(new SolidBrush(BaseColor), GP);
|
_with17.FillPath(new SolidBrush(Color.FromArgb(20, Color.White)), GP);
|
|
//-- Text
|
_with17.DrawString(Text, Font, new SolidBrush(TextColor), Base, ForeverLibrary.CenterSF);
|
}
|
else
|
{
|
//-- Base
|
_with17.FillRectangle(new SolidBrush(BaseColor), Base);
|
_with17.FillRectangle(new SolidBrush(Color.FromArgb(20, Color.White)), Base);
|
|
//-- Text
|
_with17.DrawString(Text, Font, new SolidBrush(TextColor), Base, ForeverLibrary.CenterSF);
|
}
|
break;
|
case MouseStateForever.Down:
|
if (Rounded)
|
{
|
//-- Base
|
GP = RoundedBase;
|
_with17.FillPath(new SolidBrush(BaseColor), GP);
|
_with17.FillPath(new SolidBrush(Color.FromArgb(20, Color.Black)), GP);
|
|
//-- Text
|
_with17.DrawString(Text, Font, new SolidBrush(TextColor), Base, ForeverLibrary.CenterSF);
|
}
|
else
|
{
|
//-- Base
|
_with17.FillRectangle(new SolidBrush(BaseColor), Base);
|
_with17.FillRectangle(new SolidBrush(Color.FromArgb(20, Color.Black)), Base);
|
|
//-- Text
|
_with17.DrawString(Text, Font, new SolidBrush(TextColor), Base, ForeverLibrary.CenterSF);
|
}
|
break;
|
}
|
|
base.OnPaint(e);
|
G.Dispose();
|
e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
e.Graphics.DrawImageUnscaled(B, 0, 0);
|
B.Dispose();
|
}
|
|
private void UpdateColors()
|
{
|
ForeverColors Colors = ForeverLibrary.GetColors(this);
|
|
BaseColor = Colors.Forever;
|
}
|
}
|
|
#endregion
|
}
|