Примечание: Вопрос Использование значка Vista 256 x 256 в приложении касается использования значка «Vista» в качестве значка приложения. Этот вопрос касается рисования значка Vista вручную.
Примечание: Вопрос WinForms .NET 2.0: как нарисовать значок нужного размера? касается рисования значка Vista, загруженного из файла. Этот вопрос касается рисования значка Vista, загружаемого из .resource.
Я включил в свой проект Visual Studio значок, который имеет разные форматы:
Теперь хочу нарисовать версию 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?
Заметки:
Значок не из файла, поэтому PInvoking LoadImage () не поможет.
Значок не является значком, связанным с файлом, поэтому PInvoking SHGetFileInfo () воля не поможет. Как и используя Icon.ExtractAssociatedIcon.
Я также не пытаюсь создавать значки в формате 256x256 во время выполнения, поэтому библиотеки, предназначенные для этого не поможет.
2: Вопрос WinForms .NET 2.0: как нарисовать значок нужного размера?
Это другой вопрос. Это касается использования значка Vista в качестве значка приложения. Это касается рисования значка Vista в графике.
Можете ли вы вставить в файл (работает slexy.org) образец 256 ^ 2 PNG-файла resx значка, чтобы я мог его взломать (или рассказать мне, как его легко сделать)
Я ответил на тот же вопрос здесь...
Как ни странно, вы там ответили на мой вопрос. Но это не дает ответа на этот вопрос. Этот ответ используется для загрузки значка из файла. У этого вопроса нет файла.
Нет API для загрузки таких значков из потока. Старые COM-интерфейсы, используемые .NET, не обновлялись в Vista.
Не могли бы вы включить эти классы интерфейса COM и IID интерфейса? Мне было бы любопытно увидеть COM-объекты, которые .NET использует для загрузки и рисования значков.
Существует интерфейс IExtractIcon: msdn.microsoft.com/en-us/library/bb761854(VS.85).aspx - и документация также намекает на вызов msdn.microsoft.com/en-us/library/bb776417(VS.85).aspx ExtractIcon API. Однако ни один из них не подходит для значков 256x256.





Некоторое время назад я задал аналогичный вопрос, но без особого успеха. Некоторые ответы в моем посте могут вам помочь, был один способ, но он выглядит довольно сложным. Ссылка на мой пост здесь
Ответы там используются для извлечения соответствующего значка для файла; который дал бы вам значок перспективы, только если бы вы были в перспективе. Также требуется, чтобы вы получали значок из файла. Это значок, созданный мной.
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 ()
повторно открыт - дублирующаяся ветка не имеет принятого / правильного ответа на этот конкретный вопрос