diff --git a/skiffWindowsApp/Skiff Desktop/MainWindow.xaml.cs b/skiffWindowsApp/Skiff Desktop/MainWindow.xaml.cs index c204ac0..db3c49c 100644 --- a/skiffWindowsApp/Skiff Desktop/MainWindow.xaml.cs +++ b/skiffWindowsApp/Skiff Desktop/MainWindow.xaml.cs @@ -10,6 +10,10 @@ using CustomNotificationsExample.CustomMessage; using System.Net.Http; using System.Net.Http.Headers; +using System.Drawing; +using System.Windows.Media; +using System.Windows.Interop; +using System.Windows.Media.Imaging; namespace Skiff_Desktop { @@ -57,6 +61,7 @@ public MainWindow() StateChanged += OnWindowStateChanged; SizeChanged += OnWindowSizeChanged; RestoreWindow(); + TaskbarItemInfo = new(); } internal void RestoreWindow() @@ -209,6 +214,31 @@ internal void UpdateUnreadCount(int newTotal) { UnreadCount = newTotal; UnreadCounterChanged?.Invoke(); + + TaskbarItemInfo.Overlay = null; + if (UnreadCount > 0) + TaskbarItemInfo.Overlay = GetCounterBadge(); + } + + private ImageSource GetCounterBadge() + { + using Bitmap bitmap = Properties.Resources.badgebg; + using Graphics graphics = Graphics.FromImage(bitmap); + + using StringFormat format = new() + { + LineAlignment = StringAlignment.Center, + Alignment = StringAlignment.Center, + }; + var point = new PointF(15f, 17f); + var font = new Font(System.Drawing.FontFamily.GenericSansSerif, emSize: 5f, System.Drawing.FontStyle.Bold); + string counterStr = Math.Clamp(UnreadCount, 0, 99).ToString(); + graphics.DrawString(counterStr, font, System.Drawing.Brushes.White, point, format); + + return Imaging.CreateBitmapSourceFromHIcon( + bitmap.GetHicon(), + Int32Rect.Empty, + BitmapSizeOptions.FromEmptyOptions()); } } diff --git a/skiffWindowsApp/Skiff Desktop/Properties/Resources.Designer.cs b/skiffWindowsApp/Skiff Desktop/Properties/Resources.Designer.cs index a955297..3fdde1c 100644 --- a/skiffWindowsApp/Skiff Desktop/Properties/Resources.Designer.cs +++ b/skiffWindowsApp/Skiff Desktop/Properties/Resources.Designer.cs @@ -60,6 +60,16 @@ internal Resources() { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap badgebg { + get { + object obj = ResourceManager.GetObject("badgebg", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/skiffWindowsApp/Skiff Desktop/Properties/Resources.resx b/skiffWindowsApp/Skiff Desktop/Properties/Resources.resx index bf22922..7705b23 100644 --- a/skiffWindowsApp/Skiff Desktop/Properties/Resources.resx +++ b/skiffWindowsApp/Skiff Desktop/Properties/Resources.resx @@ -118,6 +118,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\badgebg.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/skiffWindowsApp/Skiff Desktop/badgebg.png b/skiffWindowsApp/Skiff Desktop/badgebg.png new file mode 100644 index 0000000..e13f9c9 Binary files /dev/null and b/skiffWindowsApp/Skiff Desktop/badgebg.png differ