【问题标题】:ToolStripMenuItem: Add arrow without submenuToolStripMenuItem:添加没有子菜单的箭头
【发布时间】:2015-04-01 01:54:41
【问题描述】:

如何添加一个向右箭头的菜单项,就好像有子菜单但不显示子菜单一样?

背景:对于托管 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;

但是包含箭头的子菜单要么消失,要么什么都没有。

【问题讨论】:

  • 箭头取决于有一个子菜单这一事实 - 禁用它或隐藏它会隐藏箭头。您可以使用图标或其中之一:->、=>、-->。
  • 现在真的有办法强制这样做吗?如果没有,我如何在右侧对齐文本/图像(箭头所在的位置)?
  • 另外:有没有简单的方法从 DLL 中的资源加载菜单(例如 MFC 中的 CMenu::FromResource?)我猜不是...
  • 我只是看到这不是一个真正的解决方案,因为:Windows 字体中不存在实际的 unicode 箭头(右三角形,代码 9205)。图片是无解的,好像只能用一张图片

标签: c# winforms toolstrip toolstripmenu


【解决方案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);
    }

【讨论】:

    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2023-03-16
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多