2010-06-13 6 views
16

특히 런타임에 작은 (16 x 16) 아이콘을 얻을 수 있기를 바랍니다. .NET에서 다양한 크기의 Windows 시스템 아이콘을 가져 오는 방법이 있습니까?

나는 노력이 :

가정 "요청 된 크기와 일치하는 아이콘의 버전을 찾으려고 시도합니다",하지만 여전히 나에게 32 X 32 아이콘을주고
new Icon(SystemIcons.Error, SystemInformation.SmallIconSize) 

. 나는 또한 시도 :

Size iconSize = SystemInformation.SmallIconSize; 
Bitmap bitmap = new Bitmap(iconSize.Width, iconSize.Height); 
using (Graphics g = Graphics.FromImage(bitmap)) 
{ 
    g.DrawIcon(SystemIcons.Error, new Rectangle(Point.Empty, iconSize)); 
} 

하지만 그건 그냥 난 그냥 VS 이미지 라이브러리에서 아이콘을 끌어 간주 한 못생긴 16 × 16

아래로 32 X 32 아이콘을 확장,하지만 난 정말 원하는 OS (XP에서는 XP 아이콘, Vista에서는 Vista 아이콘 등)와 동적으로 다를 수 있습니다. 그게 필요한 경우 P/Invoke 기꺼이.

답변

6

나는 P/Invoking를 감았습니다. LoadIconLoadImage은 모두 SystemIcons과 동일한 (결함이있는) IMO 동작을 나타냅니다. 그러나 Vista에서 사용 가능한 SHGetStockIconInfo은 기대했던대로 작동하며 내가 찾고 있었던 작고 공식적인 디자이너가 제작 한 아이콘을 반환합니다.

XP 및 이전 버전에서는 VS 이미지 라이브러리에 제공된 작은 아이콘을 사용합니다.

P/Invoking SHGetStockIconInfo에 대해 생각하는 경우 Windows API Code Pack을 확인하는 것이 좋습니다.

+1

Vista 이외의 대체 시스템을 포함하여이 솔루션에 대한 코드 샘플을 제공 할 수 있다고 생각하십니까? – miroxlav

1

이 생성자 오버로드에 대한 문서는 말한다 :

"는 Icon 클래스의 새 인스턴스를 초기화하고 요청 된 크기와 일치하는 아이콘의 버전을 찾으려고 시도

." 크기와 정확히 일치하는 버전을 찾을 수없는 경우 가장 가까운 일치 항목이 사용됩니다. 유일한 및;. original 매개 변수가 하나의 크기를 가진 Icon 경우 ,이 메소드는

내가이 아이콘이 하나 개의 크기 (32 × 32)가 있는지 생각 "중복 아이콘를 생성 다른 크기를 얻는 방법은 예제에서와 같이이 아이콘의 크기를 조절하는 것입니다.

+0

이 아이콘은 분명히 작은 크기로 존재합니다. SystemIcon을 통해 액세스 할 수 없다면 괜찮습니다.하지만 작동하는 방법이 있는지 알고 싶습니다. –

+0

죄송합니다.이 아이콘이 더 작은 크기로 존재 함을 어떻게 알 수 있습니까? –

+0

표준 아이콘과 표준 크기입니다.Windows UX 지침 (http://msdn.microsoft.com/en-us/library/aa511277(v=MSDN.10).aspx)에서 사용중인 예제를 볼 수 있습니다. –

13

직접 조정해야합니다. 알아 낸 것처럼 SystemIcons는 16 또는 32로 쉽게 조정할 수 있습니다. 48 필요에 따라 보간법을 사용하여 멋진 바이 큐빅 크기 조정하기. 6X16 버전과는 XP 또는 Vista 또는 7

Size iconSize = SystemInformation.SmallIconSize; 
Bitmap bitmap = new Bitmap(iconSize.Width, iconSize.Height); 

using (Graphics g = Graphics.FromImage(bitmap)) 
{ 
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
    g.DrawImage(SystemIcons.Error.ToBitmap(), new Rectangle(Point.Empty, iconSize)); 
} 

Icon smallerErrorIcon = Icon.FromHandle(bitmap.GetHicon()); 

은 MSDN 예 here을 확인하시기 바랍니다, 작업이 완료되면 핸들을 정리하는 DestroyIcon 방법, 특히 사용을 실행하고 있는지 잘 작동합니다.

+0

네 말이 맞아. DrawIcon은 보간 모드를 고려하지 않습니다. DrawIcon을 DrawBitmap으로 대체하고, SystemIcons.Error.ToBitmap()을 사용하여 bmp로 아이콘을 변환하면 좋은 결과를 얻습니다. – Maxence

+0

아이콘 이미지를 더 작은 크기로 다시 그렸으므로 위의 코드에서'Icon' 객체를 어떻게 얻습니까? – FishBasketGordo

+0

MSDN의 좋은 예가 [here] (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.gethicon.aspx)입니다. 기본적으로 새로 만들어진 Bitmap에서'GetHicon'을 호출하면 정적'Icon.FromHandle' 메서드를 사용할 수 있습니다. 외부의'DestroyIcon' 메소드의 사용에주의하십시오. 핸들로 작업하는 것은 C#의 해킹을 직접 느낄 수 있으며 올바른 정리가 필요하지만 오. –

관련 문제