2015-01-18 5 views
0

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)

+0

왜 이러한 SHIL 값이 함수와 관련이 있다고 생각하는지 짐작하기 어렵습니다. 연결된 MSDN 기사에서 유효한 SHGFI 값을 나열합니다. –

+0

정확함, atm을 얻을 수있는 최대 크기는 32x32 크기 아이콘입니다. 나의 예는 내가해야 할 일이다. 나는 다른 질문에 대한 몇 가지 예를 발견했는데 그것에 대한 설명이 거의 없었다. 그래서 나는 그것을 시도했다. 하지만 제가 생각할 수있는 유일한 이유는 LARGE와 SMALL의 가치가 같기 때문입니다. 이제 예상대로 작동하지 않기 때문에 함수에서 반환 할 수있는 가장 큰 아이콘 크기를 물어볼 것입니다. –

답변

5

시스템 이미지 목록의 색인은 모든 아이콘 크기에서 동일하므로 SHGetFileInfo을 사용하여 SHGFI_SYSICONINDEX 플래그로 색인을 가져오고 imagelist API을 사용하여 "초대형"또는 "점보"이미지 목록에서 색인을 추출하십시오. SHGetImageList 기능에서 가져올 수 있습니다.

SHGetFileInfo은 소형 (예 : 16x16) 및 대형 (예 : 32x32) HICON 만 반환 할 수 있습니다.

+0

정확히 내가 방금 배웠던 것을하는 방법! 감사 –

관련 문제