从 SHGetFileInfo() 返回的图标的最大大小是多少?
What is the Maximum Size Of An Icon Returned From SHGetFileInfo()?
使用 SHGetFileInfo() 函数,我可以获得的图标的最大尺寸是多少?就函数状态而言,我可以取回一个 32x32 像素的图标(又名 SHGFI_LARGEICON)。但我想弄清楚是否有办法得到更大的东西,比如 48x48 像素的图标。
我发现有常量,例如...
public const uint SHGFI_LARGEICON = 0x000000000; // get large icon
public const uint SHGFI_SMALLICON = 0x000000001; // get small icon
public const uint SHIL_JUMBO = 0x000000004; // get jumbo icon 256x256
public const uint SHIL_EXTRALARGE = 0x000000002; // get extra large icon 48x48
public const uint SHIL_LARGE = 0x000000000; // get large icon 32x32
public const uint SHIL_SMALL = 0x000000001; // get small icon 16x16
public const uint SHIL_SYSSMALL = 0x000000003; // get icon based off of GetSystemMetrics
...但我不确定这些是否对 SHGetFileInfo() 有效。我试过了,图标看起来很模糊而且不正确。 (它们看起来 clear/nice 不像 Windows Explorer 中的那些,你使用 View: Medium Icons 设置)
这就是我所拥有的(注意:这不是一个有效的解决方案,SHIL 值没有记录在 SHGetFileInfo() 函数中。这只是我尝试的东西。)...
public const uint SHIL_JUMBO = 0x000000004; // get jumbo icon 256x256
public const uint SHIL_EXTRALARGE = 0x000000002; // get extra large icon 48x48
public const uint SHIL_LARGE = 0x000000000; // get large icon 32x32
public const uint SHIL_SMALL = 0x000000001; // get small icon 16x16
public const uint SHIL_SYSSMALL = 0x000000003; // get icon based off of GetSystemMetrics
public const uint SHGFI_ICON = 0x000000100; // get icon
public const uint SHGFI_OPENICON = 0x000000002; // get open icon
[DllImport("Shell32.dll")]
public static extern IntPtr SHGetFileInfo(
IntPtr pszPath,
uint dwFileAttributes,
ref SHFILEINFO psfi,
uint cbFileInfo,
uint uFlags
);
[DllImport("User32.dll")]
public static extern int DestroyIcon(IntPtr hIcon);
public struct SHFILEINFO
{
public const int NAMESIZE = 80;
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NAMESIZE)]
public string szTypeName;
}
public enum IconSize
{
Jumbo = 4, //256x256
ExtraLarge = 2, //48x48
Large = 0, //32x32
Small = 1 //16x16
}
IconSize size = IconSize.ExtraLarge;
uint flags = SHGFI_ICON;
flags |= SHGFI_OPENICON;
switch (size)
{
case IconSize.Small:
flags |= SHIL_SMALL;
break;
case IconSize.Large:
flags |= SHIL_LARGE;
break;
case IconSize.ExtraLarge:
flags |= SHIL_EXTRALARGE;
break;
case IconSize.Jumbo:
flags |= SHIL_JUMBO;
break;
}
//Get me a PDIL to the My Documents folder (this is done with a LOT of other
//code but I know for a fact it returns the name, path, and PDIL correctly!
CGFolder cFolder = new CGFolder(Environment.SpecialFolder.MyDocuments);
string sName = cFolder.Pidl.DisplayName;
string sPath = cFolder.Pidl.PhysicalPath;
IntPtr ptrPDIL = cFolder.Pidl.Pidl;
SHFILEINFO shfi = new SHFILEINFO();
SHGetFileInfo(ptrPDIL, 0, ref shfi, (uint)Marshal.SizeOf(shfi), flags);
if (shfi.hIcon == IntPtr.Zero) return null;
icon = (Icon)Icon.FromHandle(shfi.hIcon).Clone();
DestroyIcon(shfi.hIcon);
return icon;
参考文献:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762179%28v=vs.85%29.aspx)
系统图像列表中的索引对于所有图标大小都是相同的,因此使用 SHGetFileInfo
和 SHGFI_SYSICONINDEX
标志获取索引,并使用 imagelist API to extract it from the "extra-large" or "jumbo" image lists which you can get from the SHGetImageList
函数。
SHGetFileInfo
本身只能 return 小的(例如 16x16)和大的(例如 32x32)HICON。
使用 SHGetFileInfo() 函数,我可以获得的图标的最大尺寸是多少?就函数状态而言,我可以取回一个 32x32 像素的图标(又名 SHGFI_LARGEICON)。但我想弄清楚是否有办法得到更大的东西,比如 48x48 像素的图标。
我发现有常量,例如...
public const uint SHGFI_LARGEICON = 0x000000000; // get large icon
public const uint SHGFI_SMALLICON = 0x000000001; // get small icon
public const uint SHIL_JUMBO = 0x000000004; // get jumbo icon 256x256
public const uint SHIL_EXTRALARGE = 0x000000002; // get extra large icon 48x48
public const uint SHIL_LARGE = 0x000000000; // get large icon 32x32
public const uint SHIL_SMALL = 0x000000001; // get small icon 16x16
public const uint SHIL_SYSSMALL = 0x000000003; // get icon based off of GetSystemMetrics
...但我不确定这些是否对 SHGetFileInfo() 有效。我试过了,图标看起来很模糊而且不正确。 (它们看起来 clear/nice 不像 Windows Explorer 中的那些,你使用 View: Medium Icons 设置)
这就是我所拥有的(注意:这不是一个有效的解决方案,SHIL 值没有记录在 SHGetFileInfo() 函数中。这只是我尝试的东西。)...
public const uint SHIL_JUMBO = 0x000000004; // get jumbo icon 256x256
public const uint SHIL_EXTRALARGE = 0x000000002; // get extra large icon 48x48
public const uint SHIL_LARGE = 0x000000000; // get large icon 32x32
public const uint SHIL_SMALL = 0x000000001; // get small icon 16x16
public const uint SHIL_SYSSMALL = 0x000000003; // get icon based off of GetSystemMetrics
public const uint SHGFI_ICON = 0x000000100; // get icon
public const uint SHGFI_OPENICON = 0x000000002; // get open icon
[DllImport("Shell32.dll")]
public static extern IntPtr SHGetFileInfo(
IntPtr pszPath,
uint dwFileAttributes,
ref SHFILEINFO psfi,
uint cbFileInfo,
uint uFlags
);
[DllImport("User32.dll")]
public static extern int DestroyIcon(IntPtr hIcon);
public struct SHFILEINFO
{
public const int NAMESIZE = 80;
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NAMESIZE)]
public string szTypeName;
}
public enum IconSize
{
Jumbo = 4, //256x256
ExtraLarge = 2, //48x48
Large = 0, //32x32
Small = 1 //16x16
}
IconSize size = IconSize.ExtraLarge;
uint flags = SHGFI_ICON;
flags |= SHGFI_OPENICON;
switch (size)
{
case IconSize.Small:
flags |= SHIL_SMALL;
break;
case IconSize.Large:
flags |= SHIL_LARGE;
break;
case IconSize.ExtraLarge:
flags |= SHIL_EXTRALARGE;
break;
case IconSize.Jumbo:
flags |= SHIL_JUMBO;
break;
}
//Get me a PDIL to the My Documents folder (this is done with a LOT of other
//code but I know for a fact it returns the name, path, and PDIL correctly!
CGFolder cFolder = new CGFolder(Environment.SpecialFolder.MyDocuments);
string sName = cFolder.Pidl.DisplayName;
string sPath = cFolder.Pidl.PhysicalPath;
IntPtr ptrPDIL = cFolder.Pidl.Pidl;
SHFILEINFO shfi = new SHFILEINFO();
SHGetFileInfo(ptrPDIL, 0, ref shfi, (uint)Marshal.SizeOf(shfi), flags);
if (shfi.hIcon == IntPtr.Zero) return null;
icon = (Icon)Icon.FromHandle(shfi.hIcon).Clone();
DestroyIcon(shfi.hIcon);
return icon;
参考文献:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762179%28v=vs.85%29.aspx)
系统图像列表中的索引对于所有图标大小都是相同的,因此使用 SHGetFileInfo
和 SHGFI_SYSICONINDEX
标志获取索引,并使用 imagelist API to extract it from the "extra-large" or "jumbo" image lists which you can get from the SHGetImageList
函数。
SHGetFileInfo
本身只能 return 小的(例如 16x16)和大的(例如 32x32)HICON。