SHGetFileInfo() 함수 사용하기 내가 되돌릴 수있는 아이콘의 최대 크기는 얼마입니까? 늘어나는만큼 기능 상태는 32x32 픽셀 아이콘 (일명 SHGFI_LARGEICON)을 얻을 수 있습니다. 그러나 48x48 픽셀 아이콘처럼 더 커지는 방법이 있는지 알아 내려고했습니다.SHGetFileInfo()에서 반환되는 아이콘의 최대 크기는 얼마입니까?
내가 좋아하는 상수 있다는 것을 발견...
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() 여부에 대한 유효한지 모르겠어요. 나는 그것을 시도하고 아이콘이 흐릿하고 옳지 않은 것처럼 보인다. (그들은보기 : 매체 아이콘 설정을 사용하여 Windows 탐색기에서와 같이 선명하고 멋지게 보이지 않습니다.)
이것은 내가 가지고있는 것입니다 (참고 :이 해결책은 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)
왜 이러한 SHIL 값이 함수와 관련이 있다고 생각하는지 짐작하기 어렵습니다. 연결된 MSDN 기사에서 유효한 SHGFI 값을 나열합니다. –
정확함, atm을 얻을 수있는 최대 크기는 32x32 크기 아이콘입니다. 나의 예는 내가해야 할 일이다. 나는 다른 질문에 대한 몇 가지 예를 발견했는데 그것에 대한 설명이 거의 없었다. 그래서 나는 그것을 시도했다. 하지만 제가 생각할 수있는 유일한 이유는 LARGE와 SMALL의 가치가 같기 때문입니다. 이제 예상대로 작동하지 않기 때문에 함수에서 반환 할 수있는 가장 큰 아이콘 크기를 물어볼 것입니다. –