2009-02-27 5 views
19

Visual C# 2008 Express를 사용하고 있습니다. 응용 프로그램 (예 : .exe에 표시된 아이콘)과 기본 폼에 동일한 아이콘을 사용하고 싶습니다. 안타깝게도 VC#은 이것에 관해 매우 똑똑하지는 않지만 아이콘 데이터 복제를 주장합니다..NET (C#) 프로젝트에서 중복 아이콘 리소스 피하기

양식이나 프로젝트 아이콘 (파일 선택 만)에 사용할 "이미 포함 된"아이콘을 선택하는 방법이없는 것 같으며 두 파일에 같은 파일을 사용하면 파일이 두 번 포함됩니다. 내가 볼 수있는 한 멀리. 그것은 큰 문제가 아닙니다 (하드 드라이브 공간은 현재 저렴합니다, 그렇죠?)하지만 그것은 나에게 버그입니다.

어떤 생각을 어떻게 피할 수 있습니까? 양식이 구성 될 때 사용하기 위해 실행 가능 아이콘을 프로그래밍 방식으로로드하는 방법이 있습니까? 비슷한 것들에 관한 몇 가지 포럼 게시물은 .NET 리소스가 기존의 오래된 Windows 리소스 시스템을 사용하지 않는다고 제안하는 것으로 보입니다. 예전 스타일의 리소스를 얻는 프레임 워크 내에서 방법이 있습니까? 또는 Win32 API 함수를 바인드해야합니까?

+0

왜 상속을 사용하지 않습니까? 하나의 사용자 정의 Form 클래스에 아이콘을 정의하고 어디에서나 사용할 수 있습니다. –

+0

필자는 Delphi 프로그래밍 시간을 기억합니다 ... self.Icon = Application.Icon; : P ... .NET에서 너무 어려움 : D – Learner

+0

가능한 중복 [리소스에서 아이콘을 사용하는 쉬운 방법?] (http : // stackoverflow.com/questions/5656809/any-easy-way-to-use-icons-from-resources) – KyleMit

답변

6

네, 꽤 귀찮습니다. 그러나 Icon.ExtractAssociatedIcon의 제안 된 대답의 문제점은 32x32 아이콘을 검색 한 다음 양식 창이나 작업 표시 줄에서 16x16 아이콘으로 다운 샘플링하는 것입니다.이 경우 32x32 아이콘이 매우 교묘하게 구성되지 않는 한 끔찍하게 보입니다.

내가하고 있어요 방법은 상호 운용성 (양식 생성자의 첫 번째 라인을 넣어) 함께 :

this.Icon = ExtractSmallIconFromLibrary(Application.ExecutablePath); 
... 

public static Icon ExtractSmallIconFromLibrary(string file) { 
    IntPtr[] reficon = new IntPtr[1]; 
    int nextracted = ExtractIconEx(file, 0, null, reficon, 1); 
    if (nextracted < 1) 
     return null; 
    Icon unmanaged_icon = Icon.FromHandle(reficon[0]); 
    Icon icon = (Icon)unmanaged_icon.Clone(); 
    DestroyIcon(unmanaged_icon.Handle); 
    return icon; 
} 

[DllImport("Shell32", CharSet = CharSet.Auto)] 
extern static int ExtractIconEx(
    [MarshalAs(UnmanagedType.LPTStr)] 
    string lpszFile, 
    int nIconIndex, 
    IntPtr[] phIconLarge, 
    IntPtr[] phIconSmall, 
    int nIcons 
    ); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
extern static bool DestroyIcon(IntPtr handle); 

을하지만는 32 × 32 아이콘을 싶어 때문에 이것은 역시 크지 않다 Alt-Tab 아이콘 목록과 같은 것들. 따라서 실제로는 전체 아이콘을 추출해야합니다. 더 큰 작업입니다. 어쩌면 두 아이콘을 하나로 결합하는 간단한 방법이있을 것입니다. 또는이 코드는 codeproject 프로그램처럼 수행 할 수 있습니다.이 프로그램은 엄청난 양의 코드로 전체 아이콘을 추출합니다.

14

당신 말이 맞아요, 그것은 다소 성가신 일입니다.

디자이너에서 생성 한 코드 대신에 아이콘을 직접로드해야합니다. 다음 폼의 생성자에서 폼의 Icon 재산에 리소스를로드 프로젝트 자원으로 아이콘을 저장 : 당신은 Icon.ExtractAssociatedIcon 찾고있는

this.Icon = Properties.Resources.myIconResourceName; 
+0

그래도 해결되지 않음 : 아이콘을 프로젝트 리소스로 포함하는 것은 양식 디자이너에서 설정하는 것과 동일합니다. 그것은 피하려고하는 아이콘 데이터를 복제합니다. –

+0

아이콘을 프로젝트 아이콘으로 추가 할 때 리소스로 이미 포함되어 있어야합니다. 아니요? –

+0

실행 파일에 사용 된 아이콘이 .NET 리소스 시스템과 완전히 독립적 인 것으로 보입니다. –

10

. 실행 파일을 전달하는 호출 :

var icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location); 
+5

이것이 왜 느린 지 설명하십시오. Assembly.GetExecutingAssembly() 대신 Application.ExecutablePath를 사용하면 쉽게 해결할 수있는 리플렉션을 사용하고 있기 때문입니다. –

+0

최상의 솔루션! 자원의 아이콘을 복제하지 않고 작업 표시 줄에 최상의 품질의 아이콘을 표시합니다. 고맙습니다! – Geograph

1

비슷한 문제가있었습니다.

내가 갖고있는 exe 아이콘 파일 크기를 늘리지 않고 하위 양식을 다시 사용하고 싶습니다.

//From MyApp 
MySubForm msf = new MySubForm(); 
msf.Icon = this.Icon; 
msf.Show(); 

이 방법이 유용할지 모르겠지만 어쨌든 공유하고 싶습니다.

3

많은 경우 복제 아이콘을 포함하여 관리되지 않는 리소스에서 추출하는 것보다 더 효율적이라고 생각합니다. UNC 경로에 Icon.ExtractAssociatedIcon을 사용할 수 없다고 생각하면됩니다.

관련 문제