Windows Forms .NET 2.0: как нарисовать значок PNG?

Примечание: Вопрос Использование значка Vista 256 x 256 в приложении касается использования значка «Vista» в качестве значка приложения. Этот вопрос касается рисования значка Vista вручную.

Примечание: Вопрос WinForms .NET 2.0: как нарисовать значок нужного размера? касается рисования значка Vista, загруженного из файла. Этот вопрос касается рисования значка Vista, загружаемого из .resource.


Я включил в свой проект Visual Studio значок, который имеет разные форматы:

  • 16x16
  • 32x32
  • 48x48
  • 256x256 (сжатый PNG)

Теперь хочу нарисовать версию 256x256. Ни одна из следующих вещей, которые я пробовал, не работает.

Ниже показан формат 32x32, растянутый до 256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 256, 256));

Следующее рисует формат 32x32 без растяжения:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 256, 256));

Ниже показан формат 32x32, растянутый до 256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 256, 256));

Ниже показан формат 48x48, растянутый до 256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIcon(
      new Icon(ico, new Size(256, 256)),
      new Rectangle(0, 0, 256, 256));

Как нарисовать значок формата 256x256?


Заметки:

  1. Значок не из файла, поэтому PInvoking LoadImage () не поможет.

  2. Значок не является значком, связанным с файлом, поэтому PInvoking SHGetFileInfo () воля не поможет. Как и используя Icon.ExtractAssociatedIcon.

  3. Я также не пытаюсь создавать значки в формате 256x256 во время выполнения, поэтому библиотеки, предназначенные для этого не поможет.

    2: Вопрос WinForms .NET 2.0: как нарисовать значок нужного размера?

повторно открыт - дублирующаяся ветка не имеет принятого / правильного ответа на этот конкретный вопрос

Steven A. Lowe 13.11.2008 18:31

Это другой вопрос. Это касается использования значка Vista в качестве значка приложения. Это касается рисования значка Vista в графике.

Ian Boyd 14.11.2008 00:41

Можете ли вы вставить в файл (работает slexy.org) образец 256 ^ 2 PNG-файла resx значка, чтобы я мог его взломать (или рассказать мне, как его легко сделать)

TheSoftwareJedi 15.11.2008 02:09

Я ответил на тот же вопрос здесь...

Hans Passant 14.11.2008 00:28

Как ни странно, вы там ответили на мой вопрос. Но это не дает ответа на этот вопрос. Этот ответ используется для загрузки значка из файла. У этого вопроса нет файла.

Ian Boyd 14.11.2008 00:49

Нет API для загрузки таких значков из потока. Старые COM-интерфейсы, используемые .NET, не обновлялись в Vista.

Hans Passant 14.11.2008 05:34

Не могли бы вы включить эти классы интерфейса COM и IID интерфейса? Мне было бы любопытно увидеть COM-объекты, которые .NET использует для загрузки и рисования значков.

Ian Boyd 14.11.2008 19:34

Существует интерфейс IExtractIcon: msdn.microsoft.com/en-us/library/bb761854(VS.85).aspx - и документация также намекает на вызов msdn.microsoft.com/en-us/library/bb776417(VS.85).aspx ExtractIcon API. Однако ни один из них не подходит для значков 256x256.

Roman Starkov 26.06.2009 15:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
8
2 266
3

Ответы 3

Некоторое время назад я задал аналогичный вопрос, но без особого успеха. Некоторые ответы в моем посте могут вам помочь, был один способ, но он выглядит довольно сложным. Ссылка на мой пост здесь

Ответы там используются для извлечения соответствующего значка для файла; который дал бы вам значок перспективы, только если бы вы были в перспективе. Также требуется, чтобы вы получали значок из файла. Это значок, созданный мной.

Ian Boyd 14.11.2008 00:33

ResourceManager загружает значок на основе битов, хранящихся в ресурсах. Однако способ, которым он обрабатывает загрузку, не позволит вам получить доступ к значку 256x256 (эта информация не попадает в System.Drawing.Icon, который вы возвращаете).

Извините, что разочаровал вас, но единственный способ, о котором я знаю, - это загрузить значок через P / Invoke LoadImage и работать с файлом (да, я знаю, это не то, что вы искали). Итак, новый вопрос должен заключаться в следующем: как мне извлечь биты данного ресурса, чтобы сохранить их в файл? Я боюсь, что это тоже невозможно, после некоторого пошагового прохождения через System.Resources.ResourceReader, поскольку данные ресурсов кажутся коллекцией сериализованных объектов .NET.

В любом случае, для тех, кто может позволить себе загрузить значок из файла .ICO (и для меня, в качестве будущей ссылки о том, как загружать значки размером 256x256), позвоните IconConverter.LoadIcon:

using System.Runtime.InteropServices;

static class IconConverter
{
    public static System.Drawing.Icon LoadIcon(string path, int width, int height)
    {
        System.IntPtr hIcon;
        hIcon = LoadImage (System.IntPtr.Zero, path, IMAGE_ICON, width, height,
                           LR_LOADFROMFILE);
        if (hIcon == System.IntPtr.Zero)
        {
            return null;
        }
        return System.Drawing.Icon.FromHandle (hIcon);
    }

    const int IMAGE_ICON = 1;
    const int LR_LOADFROMFILE = 0x0010;

    [DllImport ("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
    static extern System.IntPtr LoadImage(System.IntPtr hInstance,
                                          string lpszName, uint uType,
                                          int cxDesired, int cyDesired,
                                          uint fuLoad);
}

Как только вы получите System.Drawing.Icon ожидаемого размера, просто раскрасьте его с помощью graphics.DrawIconUnstretched.

Сегодня я сделал очень красивую функцию для извлечение растровых изображений 256x256 из значков Vista.

Я использую его для отображения большого значка в виде растрового изображения в поле «О программе».

Эта функция принимает в качестве параметра объект Icon. Таким образом, вы можете использовать его с любыми иконками - из ресурсов, из файлов, из потоков и так далее. Он работает на любая ОС, потому что нет использует любой Win32 API, это 100% управляемый код :-)

Bitmap ExtractVistaIcon(Icon icoIcon)

Я разместил здесь свою функцию: ExtractVistaIcon ()

Другие вопросы по теме