From 99fb74bbe22bba13f6cfc27e27bfe76b64a752b3 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Wed, 24 Aug 2016 14:39:40 -0400 Subject: [PATCH] Use GDI+ Bitmaps for getting an HICON only as a fallback if loading a GDI+ Icon fails. --- src/Windows/Avalonia.Win32/IconImpl.cs | 15 ++++++++++++--- src/Windows/Avalonia.Win32/Win32Platform.cs | 21 +++++++++++++++++---- src/Windows/Avalonia.Win32/WindowImpl.cs | 4 ++-- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/Windows/Avalonia.Win32/IconImpl.cs b/src/Windows/Avalonia.Win32/IconImpl.cs index bdbf338caf..d5f227d0d9 100644 --- a/src/Windows/Avalonia.Win32/IconImpl.cs +++ b/src/Windows/Avalonia.Win32/IconImpl.cs @@ -1,6 +1,7 @@ using Avalonia.Platform; using System; using System.Collections.Generic; +using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,11 +10,19 @@ namespace Avalonia.Win32 { class IconImpl : IWindowIconImpl { - public IconImpl(System.Drawing.Bitmap iconBitmap) + private Bitmap bitmap; + private Icon icon; + + public IconImpl(Bitmap bitmap) + { + this.bitmap = bitmap; + } + + public IconImpl(Icon icon) { - IconBitmap = iconBitmap; + this.icon = icon; } - public System.Drawing.Bitmap IconBitmap { get; } + public IntPtr HIcon => icon?.Handle ?? bitmap.GetHicon(); } } diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index a7597ffb86..c6971a9f65 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -189,14 +189,15 @@ namespace Avalonia.Win32 public IWindowIconImpl LoadIcon(string fileName) { - var icon = new System.Drawing.Bitmap(fileName); - return new IconImpl(icon); + using (var stream = File.OpenRead(fileName)) + { + return CreateImpl(stream); + } } public IWindowIconImpl LoadIcon(Stream stream) { - var icon = new System.Drawing.Bitmap(stream); - return new IconImpl(icon); + return CreateImpl(stream); } public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) @@ -207,5 +208,17 @@ namespace Avalonia.Win32 return new IconImpl(new System.Drawing.Bitmap(memoryStream)); } } + + private static IconImpl CreateImpl(Stream stream) + { + try + { + return new IconImpl(new System.Drawing.Icon(stream)); + } + catch (ArgumentException) + { + return new IconImpl(new System.Drawing.Bitmap(stream)); + } + } } } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index af68257357..62fbdda275 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -684,9 +684,9 @@ namespace Avalonia.Win32 public void SetIcon(IWindowIconImpl icon) { var impl = (IconImpl)icon; - var nativeIcon = impl.IconBitmap; + var hIcon = impl.HIcon; UnmanagedMethods.PostMessage(_hwnd, (int)UnmanagedMethods.WindowsMessage.WM_SETICON, - new IntPtr((int)UnmanagedMethods.Icons.ICON_BIG), nativeIcon.GetHicon()); + new IntPtr((int)UnmanagedMethods.Icons.ICON_BIG), hIcon); } private static int ToInt32(IntPtr ptr)