Skip to content

Commit

Permalink
Uostream
Browse files Browse the repository at this point in the history
  • Loading branch information
hellzerg committed Apr 16, 2023
1 parent 0bf5e48 commit 059ded3
Show file tree
Hide file tree
Showing 2 changed files with 275 additions and 0 deletions.
63 changes: 63 additions & 0 deletions Optimizer/Controls/MoonButton.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace Optimizer
{
public sealed class MoonButton : Button
{
private int _borderRadius = 5;

public MoonButton()
{
BackColor = Color.White;
ForeColor = Color.Black;
FlatStyle = FlatStyle.Flat;
FlatAppearance.BorderSize = 0;
}

private GraphicsPath GetFigurePath(Rectangle rect, int radius)
{
GraphicsPath path = new GraphicsPath();
float curveSize = radius * 2F;

path.StartFigure();
path.AddArc(rect.X, rect.Y, curveSize, curveSize, 180, 90);
path.AddArc(rect.Right - curveSize, rect.Y, curveSize, curveSize, 270, 90);
path.AddArc(rect.Right - curveSize, rect.Bottom - curveSize, curveSize, curveSize, 0, 90);
path.AddArc(rect.X, rect.Bottom - curveSize, curveSize, curveSize, 90, 90);
path.CloseFigure();

return path;
}

protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);

pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
pevent.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
pevent.Graphics.InterpolationMode = InterpolationMode.High;

Rectangle rectSurface = ClientRectangle;
Rectangle rectBorder = Rectangle.Inflate(rectSurface, 0, 0);

using (GraphicsPath pathSurface = GetFigurePath(rectSurface, _borderRadius))
using (GraphicsPath pathBorder = GetFigurePath(rectBorder, _borderRadius))
using (Pen penSurface = new Pen(Parent.BackColor, 2))
{
Region = new Region(pathSurface);
pevent.Graphics.DrawPath(penSurface, pathSurface);
}
}

protected override void OnResize(EventArgs e)
{
base.OnResize(e);

if (_borderRadius > Height)
_borderRadius = Height;
}
}
}
212 changes: 212 additions & 0 deletions Optimizer/Controls/MoonComboBox.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Optimizer
{
public sealed class MoonComboBox : ComboBox
{
[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr ptr);
[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
[DllImport("user32.dll", EntryPoint = "ReleaseDC")]
static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);

private Color _color = Color.FromArgb(40, 40, 40);
private Color _selectedItemColor = Color.FromArgb(40, 40, 40);
private Color _borderColor = Color.FromArgb(61, 61, 61);
private Color _separatorLineColor = Color.FromArgb(61, 61, 61);

public Color SelectColor
{
get => _selectedItemColor;
set
{
_selectedItemColor = value;
Invalidate();
}
}

protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem(e);
LinearGradientBrush LGB = new LinearGradientBrush(e.Bounds, _selectedItemColor, ColorHelper.ChangeColorBrightness(_selectedItemColor, 0.7), 90.0F);

if (Convert.ToInt32(e.State & DrawItemState.Selected) == (int)DrawItemState.Selected)
{
if (!(e.Index == -1))
{
e.Graphics.FillRectangle(LGB, e.Bounds);
e.Graphics.DrawString(GetItemText(Items[e.Index]), e.Font, new SolidBrush(GetContrastColor(SelectColor)), e.Bounds);
}
}
else
{
if (!(e.Index == -1))
{
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, 40, 40)), e.Bounds);
e.Graphics.DrawString(GetItemText(Items[e.Index]), e.Font, Brushes.DimGray, e.Bounds);
}
}
LGB.Dispose();
}

protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
SuspendLayout();
Update();
ResumeLayout();
}

protected override void OnPaintBackground(PaintEventArgs e)
{
base.OnPaintBackground(e);
}

protected override void OnResize(EventArgs e)
{
base.OnResize(e);
if (!Focused)
{
SelectionLength = 0;
}
}

private static int DPIScale
{
get
{
IntPtr hdc = GetDC(IntPtr.Zero);
int DC = GetDeviceCaps(hdc, 0x58);
ReleaseDC(IntPtr.Zero, hdc);
return DC;
}
}

private int GetDPIScaleFactor(int currentDPI)
{
switch (currentDPI)
{
case 96:
return 25;
case 120:
return 30;
case 144:
return 35;
case 192:
return 40;
default:
return 25;
}
}

protected override void OnDropDown(EventArgs e)
{
base.OnDropDown(e);

DropDownHeight = Items.Count * GetDPIScaleFactor(DPIScale);
}

public MoonComboBox()
{
SetStyle((ControlStyles)0x22016, true);
SetStyle(ControlStyles.Selectable, false);

DrawMode = DrawMode.OwnerDrawFixed;
DropDownStyle = ComboBoxStyle.DropDownList;

BackColor = Color.FromArgb(246, 246, 246);
ForeColor = Color.FromArgb(76, 76, 97);
Size = new Size(135, 27);
Cursor = Cursors.Hand;
}

private GraphicsPath GetFigurePath(Rectangle rect, int radius)
{
GraphicsPath path = new GraphicsPath();
float curveSize = radius * 2F;

path.StartFigure();
path.AddArc(rect.X, rect.Y, curveSize, curveSize, 180, 90);
path.AddArc(rect.Right - curveSize, rect.Y, curveSize, curveSize, 270, 90);
path.AddArc(rect.Right - curveSize, rect.Bottom - curveSize, curveSize, curveSize, 0, 90);
path.AddArc(rect.X, rect.Bottom - curveSize, curveSize, curveSize, 90, 90);
path.CloseFigure();

return path;
}

private Color GetContrastColor(Color c)
{
double brightness = c.R * 0.299 + c.G * 0.587 + c.B * 0.114;
return brightness > 149 ? Color.Black : Color.White;
}

public enum Direction
{
Up, Down
}

private void DrawTriangle(Graphics g, Rectangle rect, Direction direction)
{
int halfWidth = rect.Width / 2;
Point p0 = Point.Empty;
Point p1 = Point.Empty;
Point p2 = Point.Empty;

switch (direction)
{
case Direction.Up:
p0 = new Point(rect.Left + halfWidth, rect.Top);
p1 = new Point(rect.Left, rect.Bottom);
p2 = new Point(rect.Right, rect.Bottom);
break;
case Direction.Down:
p0 = new Point(rect.Left + halfWidth, rect.Bottom);
p1 = new Point(rect.Left, rect.Top);
p2 = new Point(rect.Right, rect.Top);
break;
}

g.FillPolygon(Brushes.DarkGray, new Point[] { p0, p1, p2 });
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);

e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
e.Graphics.InterpolationMode = InterpolationMode.High;

e.Graphics.Clear(Parent.BackColor);

var rect = new Rectangle(0, 0, Width - 1, Height - 1);

GraphicsPath GP = GetFigurePath(rect, 5);

LinearGradientBrush LGB = new LinearGradientBrush(ClientRectangle, _color, ColorHelper.ChangeColorBrightness(_color, 0.8), 90.0F);

e.Graphics.SetClip(GP);
e.Graphics.FillRectangle(LGB, ClientRectangle);
e.Graphics.ResetClip();

e.Graphics.DrawPath(new Pen(_borderColor), GP);

e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), new Rectangle(3, 0, Width - 20, Height), new StringFormat
{
LineAlignment = StringAlignment.Center,
Alignment = StringAlignment.Near
});

DrawTriangle(e.Graphics, new Rectangle(Width - 17, (Height / 2) - 4, 8, 8), DroppedDown ? Direction.Up : Direction.Down);

e.Graphics.DrawLine(new Pen(ColorHelper.ChangeColorBrightness(_separatorLineColor, 0.8)), Width - 24, 5, Width - 24, Height - 6);
e.Graphics.DrawLine(new Pen(_separatorLineColor), Width - 25, 5, Width - 25, Height - 6);
}
}
}

0 comments on commit 059ded3

Please sign in to comment.