2015-04-01 29 views
0

如何添加一個箭頭右側的菜單項,就好像會出現子菜單一樣,但不顯示子菜單?ToolStripMenuItem:添加沒有子菜單的箭頭

背景:對於託管的C#應用​​程序,我想添加一個在非託管DLL(使用TrackPopupMenu())中創建的子菜單。

在我的實驗中,我只能使用「DropDownItems.Add」附加項時顯示箭頭。

我試圖用

ToolStripMenuItem menu = new ToolStripMenuItem(); 
m_menu.Text = "Item that should have arrow w/o submenu"; 
m_menu.Click += this.OnMenuDoSomething; 
m_menu.DropDownItems.Add(""); 

這還增加了一個子菜單。然後我嘗試了這些組合:

m_menu.DropDownItems[0].Enabled = false; 
m_menu.DropDownItems[0].Available = false; 
m_menu.DropDownItems[0].Visible = false; 

但是包括箭頭的子菜單消失或者什麼也沒有。

+0

箭頭取決於有一個子菜單的事實 - 禁用它或隱藏它隱藏箭頭。您可以使用圖標或其中之一: - >,=>, - >。 – Mathemats 2015-04-01 02:12:56

+0

現在真的有辦法強制這個嗎?如果沒有,如何對齊右側的文本/圖像(箭頭所在的地方)? – divB 2015-04-01 02:22:33

+0

另外:是否有簡單的方法來從DLL中的資源加載菜單(如MFC中的CMenu :: FromResource?)我猜不是... – divB 2015-04-01 02:25:23

回答

1

創建下拉菜單的句柄時,將其分配給NativeWindow以捕獲窗口消息並隱藏繪畫事件。事實上,你可以隱藏所有事件。

當您想要顯示下拉菜單時,只需鬆開NativeWindow's手柄即可。

E.g.

private class NW : NativeWindow { 
     public NW(IntPtr handle) { 
      AssignHandle(handle); 
     } 

     const int WM_PAINT = 0xF; 
     protected override void WndProc(ref Message m) { 
      // can ignore all messages too 
      if (m.Msg == WM_PAINT) { 
       return; 
      } 
      base.WndProc(ref m); 
     } 
    } 

    [STAThread] 
    static void Main() { 

     MenuStrip menu = new MenuStrip(); 

     NW nw = null; // declared outside to prevent garbage collection 
     ToolStripMenuItem item1 = new ToolStripMenuItem("Item1"); 
     ToolStripMenuItem subItem1 = new ToolStripMenuItem("Sub Item1"); 
     subItem1.DropDown.DropShadowEnabled = false; 
     subItem1.DropDown.HandleCreated += delegate { 
      nw = new NW(subItem1.DropDown.Handle); 
     }; 

     ToolStripMenuItem miMakeVisible = new ToolStripMenuItem("Make Visible"); 
     miMakeVisible.Click += delegate { 
      if (nw != null) { 
       nw.ReleaseHandle(); 
       nw = null; 
      } 
     }; 


     ToolStripMenuItem subItem2 = new ToolStripMenuItem("Sub Item2"); 
     item1.DropDownItems.Add(subItem1); 
     item1.DropDownItems.Add(miMakeVisible); 
     subItem1.DropDownItems.Add(subItem2); 
     menu.Items.Add(item1); 


     Form f = new Form(); 
     f.Controls.Add(menu); 
     f.MainMenuStrip = menu; 
     Application.Run(f); 
    } 
相關問題