zcbot/windows-node/Zcbot.WindowsNode/TrayIconFactory.cs

47 lines
1.6 KiB
C#

using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
namespace Zcbot.WindowsNode;
internal static class TrayIconFactory
{
internal static Icon Create(NodeState state)
{
var color = state switch
{
NodeState.Online => Color.FromArgb(34, 197, 94),
NodeState.Connecting => Color.FromArgb(245, 158, 11),
NodeState.NotRegistered or NodeState.AuthenticationRequired => Color.FromArgb(239, 68, 68),
_ => Color.FromArgb(107, 114, 128),
};
using var bitmap = new Bitmap(32, 32);
using var graphics = Graphics.FromImage(bitmap);
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.Clear(Color.Transparent);
using var background = new SolidBrush(Color.FromArgb(30, 41, 59));
using var badge = new SolidBrush(color);
using var textBrush = new SolidBrush(Color.White);
graphics.FillEllipse(background, 1, 1, 30, 30);
using var font = new Font("Segoe UI", 13, FontStyle.Bold, GraphicsUnit.Pixel);
graphics.DrawString("Z", font, textBrush, new PointF(8, 7));
graphics.FillEllipse(badge, 20, 20, 11, 11);
using var border = new Pen(Color.White, 2);
graphics.DrawEllipse(border, 20, 20, 11, 11);
var handle = bitmap.GetHicon();
try
{
using var icon = Icon.FromHandle(handle);
return (Icon)icon.Clone();
}
finally
{
DestroyIcon(handle);
}
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool DestroyIcon(nint handle);
}