我想创建一个自定义上下文菜单。我们的想法是创建一个带有textBox的面板,一个按钮和一个标签列表,并且能够在右键单击时显示它,并使其行为与contextMenu完全相同。我可以使用没有边框的表单,但我想可能有一个我可以派生的类,这将帮助我处理上下文菜单和阴影的positionnig。有任何想法吗? 谢谢
编辑:清除一些想法的示例:假设您在表单上有标签,当您右键单击它(甚至左键单击)时,会出现一个菜单。此菜单不是经典的上下文菜单,而是一个自定义面板,其中包含我创建的控件。一个示例是顶部的搜索框,其中包含项目列表。当您输入字母时,列表将被裁剪为匹配的项目,当单击某个项目时,上下文菜单将消失,并且在我们首次单击的标签中选择所选的值。
答案 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);
}
}