如何添加一个右箭头的菜单项,好像有一个子菜单但没有显示子菜单?
背景:对于托管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 :(得分: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);
}