Browse Source

Call GetHicon only once when creation a windows icon

pull/8547/head
Max Katz 4 years ago
committed by Dan Walmsley
parent
commit
949b7f2d94
  1. 20
      src/Windows/Avalonia.Win32/IconImpl.cs
  2. 4
      src/Windows/Avalonia.Win32/TrayIconImpl.cs
  3. 8
      src/Windows/Avalonia.Win32/Win32Platform.cs

20
src/Windows/Avalonia.Win32/IconImpl.cs

@ -1,6 +1,5 @@
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Avalonia.Platform;
@ -8,31 +7,18 @@ namespace Avalonia.Win32
{
class IconImpl : IWindowIconImpl
{
private Bitmap bitmap;
private Icon icon;
public IconImpl(Bitmap bitmap)
{
this.bitmap = bitmap;
}
private readonly Icon icon;
public IconImpl(Icon icon)
{
this.icon = icon;
}
public IntPtr HIcon => icon?.Handle ?? bitmap.GetHicon();
public IntPtr HIcon => icon.Handle;
public void Save(Stream outputStream)
{
if (icon != null)
{
icon.Save(outputStream);
}
else
{
bitmap.Save(outputStream, ImageFormat.Png);
}
icon.Save(outputStream);
}
}
}

4
src/Windows/Avalonia.Win32/TrayIconImpl.cs

@ -18,6 +18,8 @@ namespace Avalonia.Win32
[Unstable]
public class TrayIconImpl : ITrayIconImpl
{
private static readonly IntPtr s_emptyIcon = new System.Drawing.Bitmap(32, 32).GetHicon();
private readonly int _uniqueId;
private static int s_nextUniqueId;
private bool _iconAdded;
@ -86,7 +88,7 @@ namespace Avalonia.Win32
uID = _uniqueId,
uFlags = NIF.TIP | NIF.MESSAGE,
uCallbackMessage = (int)CustomWindowsMessage.WM_TRAYMOUSE,
hIcon = _icon?.HIcon ?? new IconImpl(new System.Drawing.Bitmap(32, 32)).HIcon,
hIcon = _icon?.HIcon ?? s_emptyIcon,
szTip = _tooltipText ?? ""
};

8
src/Windows/Avalonia.Win32/Win32Platform.cs

@ -359,7 +359,7 @@ namespace Avalonia.Win32
using (var memoryStream = new MemoryStream())
{
bitmap.Save(memoryStream);
return new IconImpl(new System.Drawing.Bitmap(memoryStream));
return CreateIconImpl(memoryStream);
}
}
@ -367,11 +367,15 @@ namespace Avalonia.Win32
{
try
{
// new Icon() will work only if stream is an "ico" file.
return new IconImpl(new System.Drawing.Icon(stream));
}
catch (ArgumentException)
{
return new IconImpl(new System.Drawing.Bitmap(stream));
// Fallback to Bitmap creation and converting into a windows icon.
using var icon = new System.Drawing.Bitmap(stream);
var hIcon = icon.GetHicon();
return new IconImpl(System.Drawing.Icon.FromHandle(hIcon));
}
}

Loading…
Cancel
Save