【问题标题】:Custom Context Menu自定义上下文菜单
【发布时间】:2012-02-29 11:31:27
【问题描述】:

我想创建一个自定义上下文菜单。这个想法是创建一个带有文本框、按钮和标签列表的面板,并能够在右键单击时显示它,并使其行为与 contextMenu 完全相同。我可能可以使用没有边框的表单,但我想可能有一个可以派生的类可以帮助我处理上下文菜单的位置和阴影。有任何想法吗? 谢谢

编辑:清除一些想法的示例:假设您的表单上有一个标签,当您右键单击它(甚至左键单击)时,会出现一个菜单。此菜单不是经典的上下文菜单,而是我个人创建的带有控件的自定义面板。一个例子是顶部的搜索框,上面有一个项目列表。当您输入字母时,列表会被修剪为匹配的项目,当单击项目时,上下文菜单会消失,所选值会写入我们第一次单击的标签中。

【问题讨论】:

  • 我认为您在这里谈论的是 Winforms ?
  • 显然你错过了工具箱中的 ContextMenuStrip 控件。
  • 不,我没有错过,我想创建自己的功能,然后从众多项目中选择一项。是的,这是关于 c# 中的 winforms。
  • 我会创建一个自定义的没有边框的表单,就像你写的那样。
  • 它是包含自定义菜单项的实际上下文 menu,还是根本不是菜单?您应该解释它的行为方式和外观以便获得建议。

标签: c# .net winforms


【解决方案1】:

您可以使用这里描述的方法:

http://www.codeproject.com/Articles/22780/Super-Context-Menu-Strip

由于它使用 ContextMenuStrip,你可以设置它的位置:

contextMenuStrip1.Show(Cursor.Position);

和阴影效果:

http://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.hasdropshadow.aspx

【讨论】:

    【解决方案2】:

    最简单的方法(因为这似乎不是一个实际的菜单)是创建一个无边框的表单并为其添加阴影:

    public class ShadowForm : Form
    {
        // Define the CS_DROPSHADOW constant
        private const int CS_DROPSHADOW = 0x00020000;
    
        // Override the CreateParams property
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ClassStyle |= CS_DROPSHADOW;
                return cp;
            }
        }
    }
    

    关于位置,没有太多。只需检查Cursor.Position 或使用MouseUp 事件处理程序中的参数设置坐标。

    完整的代码如下所示:

    public partial class ParentForm : Form
    {
        public ParentForm()
        {
            InitializeComponent();
        }
    
        protected override OnMouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                var menu = new CustomMenu();
                menu.Location = PointToScreen(e.Location);
                menu.Show(this);                
            }
        }
    }
    

    对于“菜单”形式:

    public partial class CustomMenu : Form
    {
        public CustomMenu()
        {
            InitializeComponent();
            this.StartPosition = FormStartPosition.Manual;
        }
    
        private const int CS_DROPSHADOW = 0x00020000;
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ClassStyle |= CS_DROPSHADOW;
                return cp;
            }
        }
    
        protected override void OnLostFocus(EventArgs e)
        {
            this.Close();
            base.OnLostFocus(e);
        }
    }
    

    【讨论】:

    • 我在想,通过从某个类派生,我的自定义菜单可以像设计模式下的 ContextMenu 一样使用。但是,是的,我确实同意这可以完成这项工作。谢谢你。当您在 ContextMenu 外部单击时,它会消失,在您的示例中您将如何处理?
    【解决方案3】:

    当您在 ContextMenu 外部单击时,它会消失。是的。使用此 CustomMenu,您也可以做到这一点。

        protected override void OnDeactivate(EventArgs e)
        {
            this.Close();
            base.OnDeactivate(e);
        }
    

    我对此进行了测试,对我来说效果很好。当您在表单外单击时,OnLeave 和 OnLostFocus 没有触发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 2016-06-06
      相关资源
      最近更新 更多