Windows Forms .NET 2.0: Как нарисовать значок PNG? - PullRequest
11 голосов
/ 13 ноября 2008

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

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


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

  • 16x16
  • 32х32
  • 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: Как нарисовать значок нужного размера?

Ответы [ 3 ]

3 голосов
/ 30 июня 2009

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.

0 голосов
/ 22 декабря 2009

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

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

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

Bitmap ExtractVistaIcon(Icon icoIcon)

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

0 голосов
/ 13 ноября 2008

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

...