自定义上下文菜单

时间:2012-02-29 11:31:27

标签: c# .net winforms

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

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

2 个答案:

答案 0 :(得分:5)

您可以使用此处描述的方法:

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

答案 1 :(得分:4)

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

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);
    }
}