Я запустил ваш пример, используя
const string IID_IImageList = "46EB5926-582E-4017-9FDF-E8998DAA0950";
const string IID_IImageList2 = "192B9D83-50FC-457B-90A0-2B82A8B5DAE1";
определено в CommonControls.h
После запуска:
IEnumerable<int> shils = new int[]{
ShellAPI.SHIL_EXTRALARGE,
ShellAPI.SHIL_JUMBO,
ShellAPI.SHIL_SYSSMALL,
ShellAPI.SHIL_LARGE,
ShellAPI.SHIL_SMALL,
ShellAPI.SHIL_LAST
};
ShellAPI.IImageList ppv = null;
Guid guil = new Guid(IID_IImageList2);//or IID_IImageList
foreach (int iil in shils)
{
ShellAPI.SHGetImageList(iil, ref guil, ref ppv);
int noImages = 0;
ppv.GetImageCount(ref noImages);
//...
}
количество изображений остается постоянным. Поэтому я должен не согласиться с
когда у них нет размера 256x256
Для каждого типа списка изображений существует постоянное количество изображений, поэтому для параметра jumbo отсутствуют значки.
Я сохранил все найденные значки со всеми разрешениями (16x16,32x32,48x48,256x256).
Соотношение сторон одинаково для всех разных размеров одного и того же значка (один и тот же индекс списка изображений / разное разрешение). Соотношение сторон означает, что версия 256x256 - это не версия 48x48, вставленная в угол, а остальные черные отступы на заднем плане.
Более того, все
иконки размером 256x256, но с иконкой размером 32x32 в левом верхнем углу
на самом деле являются наложенными изображениями, как можно проверить:
int currentImageListIndex; //loop by noImages above
int idx0Based=0;
ppv.GetOverlayImage(currentImageListIndex+1, ref idx0Based);
Ухудшение качества можно легко обнаружить с помощью IImageAList :: GetItemFlags и проверки выходного параметра dwFlags для ILIF_LOWQUALITY, цитата msdn приведена ниже
Windows Vista и более поздние версии. Указывает, что элемент в списке изображений был создан с помощью функции StretchBlt, следовательно, качество изображения могло ухудшиться