2012-05-20 6 views
4

내 컨텍스트 메뉴 항목 중 하나에 아이콘을 추가하려고했지만 할 수 없습니다. 아무도 나를 도울 수 있습니까?System.Windows.Forms.MenuItem에 아이콘을 추가하는 방법?

가 여기에 내가 작성한 코드입니다 :

private System.Windows.Forms.ContextMenu notifyContextMenu; 
private void foo() { 
      if (notifyIcon == null) { 
       notifyIcon = new System.Windows.Forms.NotifyIcon(); 
      } 

      if (notifyContextMenu == null) { 
       notifyContextMenu = new System.Windows.Forms.ContextMenu(); 
       notifyContextMenu.MenuItems.Add("Exit"); 
       // How do I add an icon to this context menu item? 
      } 
      notifyIcon.ContextMenu = notifyContextMenu; 
      } 
    } 

답변

5

MAINMENU /의 ContextMenu가 사용되지 않습니다, 대신 메뉴 스트립 클래스를 사용해야합니다.

변경

notifyContextMenu = new System.Windows.Forms.ContextMenu(); 
notifyContextMenu.MenuItems.Add("Exit"); 

,

notifyContextMenu = new System.Windows.Forms.ContextMenuStrip(); 
var exitMenuItem = notifyContextMenu.Items.Add("Exit"); 
exitMenuItem.Image = ...; 

http://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripitem.image.aspx

마지막으로 아이콘을 통지 컨텍스트 메뉴 스트립을 부착하는

notifyIcon.ContextMenuStrip = notifyContextMenu; 
+1

                          글쎄, 그건 정말 사실이 아니다. 예, 'Strip' 클래스는 최신 버전이지만 Windows Vista 이상에서 완전히 싫어하는 메뉴를 생성합니다. Windows에 메뉴 그리기를 요청하는 대신 .NET 코드를 사용하여 사용자 지정 그리기를 수행합니다. Windows XP에서는 모양이 좋아 보이며 Office XP에서 사용되는 사용자 지정 그리기 메뉴와 일치하지만 그 이후로 기술은 크게 발전했습니다. 노인성을 막기 위해이 못생긴 메뉴를 사용하는 것은 나에게는 꽤 어리석은 결정처럼 보입니다. 귀하의 응용 프로그램은 현대 버전의 Windows에서는 제대로 보이지 않습니다. –

+0

네이티브 래퍼는 Windows Vista 이상에서 더 잘 보이지만 사용자 정의 렌더러 (http://code.google.com/p/szotar/source/browse/trunk/Client/)를 통해 스트립 클래스에서 동일한 효과를 얻을 수 있습니다. Szotar.WindowsForms/Base/NativeToolStripRenderer.cs –

+0

동일하지 않습니다 ... (시도해 보았습니다. 다시 작성하고, 변경하고, 더 시도해 보았습니다. 동일하지 않습니다. * 네이티브 메뉴처럼 * 네이티브 메뉴처럼 동작하지 않습니다.) 그러나 실제로, 더 나은 ... –

9

01,236,266,349,527,691,은 중 가장 간단한 방법 인을 처리합니다. MainMenu 컨트롤에서 MenuStrip 컨트롤로 전환하면 각 메뉴 항목에 아이콘을 추가 할 수있는 기본 제공 기능이 기본 제공됩니다. 불행히도, 그의 답변에 a comment에서 논의했듯이,이 솔루션은 약간의 추악한 결과를 초래합니다.

특히, MenuStrip 컨트롤을 사용하면 아마도 업데이트되지 않을 .NET 코드에 의해 그려지는 사용자 정의이기 때문에 새로운 버전의 Windows에서 메뉴가 영구히 보이지 않게됩니다. 물론, 그들은 Windows XP에서 매끄럽게 보입니다. 그러나 그것은 적어도 5 년 동안 오래된 뉴스였습니다. 메뉴는 Windows Vista를 시작으로 완전히 달라 보이며 사용자가 앱에서 기대할 수있는 것입니다. 세계에서 가장 시원한 아이콘은 더 이상 현대적으로 보지 못하게합니다.

                              MenuStrip (and its little brother, ContextMenuStrip) look downright ugly on Windows Vista and later, compared to the platform native menus, as implemented with MainMenu (and its little brother, ContextMenu)

그래서 다소 더 복잡 솔루션은 실제로 윈도우 자체에 의해 그려진 메뉴를 사용하는 MainMenu 제어, 고수하는 것이지만 : 비교 아이콘 추가를 처리하는 코드를 작성하십시오.

다행히 Wyatt O'Day는 이미 사용자를 대신하여 위의 커스텀 컨트롤을 작성했습니다. 다운로드는 프로젝트에 다운로드하고, 컴파일하고, 컴파일하고, 사용하기 만하면됩니다. 오픈 소스이며 BSD 라이선스에 따라 라이선스가 부여되어 있으며 모든 버전의 Windows에서으로 표시되는 플랫폼 고유의 메뉴를 생성합니다. here from his website을 다운로드하거나 his introduction and 100% accurate rant으로 시작하십시오.

결과는 멋진 있습니다     Comparing the appearance of Wyatt's VistaMenu control on 4 different operating systems: Windows 7, Vista, XP, and 2000. On all 4, it looks just like the platform native menus, except with icons!

+0

VistaMenu와 같은 것을 재사용하는 것이 더 좋습니다. 나는 동의한다. –

+0

@Cody Grey, 사실 컨텍스트 메뉴에만 제 3 자 라이브러리를 사용하고 싶지 않습니다. 나는이 문제를 스스로 해결하려고한다. 그러나 어떻게? 내 컨텍스트 메뉴가 Vista 메뉴처럼 보이고 이미지가 포함 된 menuItem이 있으면 좋을 것입니다. 어떻게해야합니까? – Alexandre

+0

@Alex : 제가 링크 된 라이브러리는 오픈 소스입니다. 즉, 코드를보고, 코드가 무엇인지 살펴보고, 코드를 작성하는 예제로 사용할 수 있습니다. –

관련 문제