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;
но либо подменю со стрелкой исчезает, либо вообще ничего.
1 ответ
Когда дескриптор выпадающего меню создан, назначьте его NativeWindow
захватывать сообщения окна и скрывать события рисования. На самом деле, вы можете скрыть все события.
Если вы хотите показать выпадающее меню, просто отпустите NativeWindow's
справиться.
Например
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);
}