C# 自定义关联菜单

C# 自定义关联菜单,c#,.net,winforms,C#,.net,Winforms,我想创建一个自定义上下文菜单。其想法是创建一个带有文本框、按钮和标签列表的面板,并能够在右键单击时显示它,使其行为完全类似于上下文菜单。我可能可以使用无边框的表单,但我想可能有一个类可以派生出来,它可以帮助我处理上下文菜单和着色的位置。有什么想法吗? 多谢各位 编辑:一个澄清一些想法的示例:假设您的表单上有一个标签,当您右键单击它,甚至左键单击它时,会出现一个菜单。这个菜单不是经典的上下文菜单,而是一个带有我自己创建的控件的自定义面板。例如,顶部带有项目列表的搜索框。当您输入字母时,列表将被修剪

我想创建一个自定义上下文菜单。其想法是创建一个带有文本框、按钮和标签列表的面板,并能够在右键单击时显示它,使其行为完全类似于上下文菜单。我可能可以使用无边框的表单,但我想可能有一个类可以派生出来,它可以帮助我处理上下文菜单和着色的位置。有什么想法吗? 多谢各位


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

最简单的方法是创建一个无边框表单并向其添加阴影:

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;
        }
    }
}
关于立场,没有太多的东西。只需检查游标。使用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);
    }
}

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

由于它使用ContextMenuStrip,您可以设置其位置:

contextMenuStrip1.Show(Cursor.Position);
阴影效果:


我想你说的是Winforms?显然你错过了工具箱中的ContextMenuStrip控件。不,我没有错过,我想创建我自己的控件,它做的更多,然后从众多项中选择一项。是的,这是关于c语言中的winforms。我会像你写的那样创建一个自定义的无边框表单。它是包含自定义菜单项的实际上下文菜单,还是根本不是菜单?为了得到建议,你应该解释一下它的行为和外观。我在想,通过从某个类派生,我的自定义菜单可以像设计模式中的ContextMenu一样使用。但是,是的,我同意这可以完成这项工作。非常感谢。当您在上下文菜单外单击时,它将消失,在您的示例中,您将如何处理此问题?