代码之家  ›  专栏  ›  技术社区  ›  Rob Prouse

右键单击菜单项时如何显示关联菜单

  •  10
  • Rob Prouse  · 技术社区  · 16 年前

    TrackPopupMenuEx TPM_递归 旗帜

    上下文菜单 新的呢 NET中的类只有一个 显示 方法有人知道如何在.NET中实现这一点吗?

    编辑

    我试过使用 TrackPopupMenuEx 通过p/invoke,但这限制了您使用ContextMenu而不是ContextMenuStrip,这在我们的应用程序中看起来不合适。它仍然不能正常工作。它不适用于新的 右键菜单 .

    我还尝试将ToolStripMenuItem子类化,以查看是否可以向其添加上下文菜单。这是为我们工作 主菜单 但是 右键菜单

    3 回复  |  直到 16 年前
        1
  •  11
  •   Joel user3568717    11 年前

    编辑,由于评论:

    在:

    protected override void OnClick(EventArgs e)
    {
        if (SecondaryContextMenu == null || MouseButtons != MouseButtons.Right)
        {
            base.OnClick(e);
        }
    }
    

    这部分

     MouseButtons != MouseButtons.Right
    

    和MouseButtons调用Control一样。因为表单继承了控件类,所以直接调用MouseButtons属性就足够了。

    希望这有助于:

    public partial class Form1 : Form
    {
        class CustomToolStripMenuItem : ToolStripMenuItem
        {
            private ContextMenuStrip secondaryContextMenu;
    
            public ContextMenuStrip SecondaryContextMenu
            {
                get
                {
                    return secondaryContextMenu;
                }
                set
                {
                    secondaryContextMenu = value;
                }
            }
    
            public CustomToolStripMenuItem(string text)
                : base(text)
            { }
    
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    if (secondaryContextMenu != null)
                    {
                        secondaryContextMenu.Dispose();
                        secondaryContextMenu = null;
                    }
                }
    
                base.Dispose(disposing);
            }
    
            protected override void OnClick(EventArgs e)
            {
                if (SecondaryContextMenu == null || MouseButtons != MouseButtons.Right)
                {
                    base.OnClick(e);
                }
            }
        }
    
        class CustomContextMenuStrip : ContextMenuStrip
        {
            private bool secondaryContextMenuActive = false;
            private ContextMenuStrip lastShownSecondaryContextMenu = null;
    
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    if (lastShownSecondaryContextMenu != null)
                    {
                        lastShownSecondaryContextMenu.Close();
                        lastShownSecondaryContextMenu = null;
                    }
                }
                base.Dispose(disposing);
            }
    
            protected override void OnControlAdded(ControlEventArgs e)
            {
                e.Control.MouseClick += new MouseEventHandler(Control_MouseClick);
                base.OnControlAdded(e);
            }
    
            protected override void OnControlRemoved(ControlEventArgs e)
            {
                e.Control.MouseClick -= new MouseEventHandler(Control_MouseClick);
                base.OnControlRemoved(e);
            }
    
            private void Control_MouseClick(object sender, MouseEventArgs e)
            {
                ShowSecondaryContextMenu(e);
            }
    
            protected override void OnMouseClick(MouseEventArgs e)
            {
                ShowSecondaryContextMenu(e);
                base.OnMouseClick(e);
            }
    
            private bool ShowSecondaryContextMenu(MouseEventArgs e)
            {
                CustomToolStripMenuItem ctsm = this.GetItemAt(e.Location) as CustomToolStripMenuItem;
    
                if (ctsm == null || ctsm.SecondaryContextMenu == null || e.Button != MouseButtons.Right)
                {
                    return false;
                }
    
                lastShownSecondaryContextMenu = ctsm.SecondaryContextMenu;
                secondaryContextMenuActive = true;
                ctsm.SecondaryContextMenu.Closed += new ToolStripDropDownClosedEventHandler(SecondaryContextMenu_Closed);
                ctsm.SecondaryContextMenu.Show(Cursor.Position);
                return true;
            }
    
            void SecondaryContextMenu_Closed(object sender, ToolStripDropDownClosedEventArgs e)
            {
                ((ContextMenuStrip)sender).Closed -= new ToolStripDropDownClosedEventHandler(SecondaryContextMenu_Closed);
                lastShownSecondaryContextMenu = null;
                secondaryContextMenuActive = false;
                Focus();
            }
    
            protected override void OnClosing(ToolStripDropDownClosingEventArgs e)
            {
                if (secondaryContextMenuActive)
                {
                    e.Cancel = true;
                }
    
                base.OnClosing(e);
            }
        }
    
        public Form1()
        {
            InitializeComponent();
    
    
            CustomToolStripMenuItem itemPrimary1 = new CustomToolStripMenuItem("item primary 1");
            itemPrimary1.SecondaryContextMenu = new ContextMenuStrip();
            itemPrimary1.SecondaryContextMenu.Items.AddRange(new ToolStripMenuItem[] { 
                new ToolStripMenuItem("item primary 1.1"),
                new ToolStripMenuItem("item primary 1.2"),
            });
    
            CustomToolStripMenuItem itemPrimary2 = new CustomToolStripMenuItem("item primary 2");
            itemPrimary2.DropDownItems.Add("item primary 2, sub 1");
            itemPrimary2.DropDownItems.Add("item primary 2, sub 2");
            itemPrimary2.SecondaryContextMenu = new ContextMenuStrip();
            itemPrimary2.SecondaryContextMenu.Items.AddRange(new ToolStripMenuItem[] { 
                new ToolStripMenuItem("item primary 2.1"),
                new ToolStripMenuItem("item primary 2.2"),
            });
    
            CustomContextMenuStrip primaryContextMenu = new CustomContextMenuStrip();
            primaryContextMenu.Items.AddRange(new ToolStripItem[]{
                itemPrimary1,
                itemPrimary2
            });
    
            this.ContextMenuStrip = primaryContextMenu;
        }
    }
    
        2
  •  2
  •   Jason Diller    16 年前

    [DllImport("user32.dll")]
    static extern bool TrackPopupMenuEx(IntPtr hmenu, uint fuFlags, int x, int y,
    IntPtr hwnd, IntPtr lptpm);
    
    const int TPM_RECURSE = 0x0001; 
    
        3
  •  0
  •   TheUberOverLord    16 年前

    这显示了如何使用多个上下文菜单以及不同的菜单与任何组合的鼠标点击。

    详情如下: http://code.msdn.microsoft.com/TheNotifyIconExample