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);
    }
Другие вопросы по тегам