如何编写自己的上下文菜单?C#

如何编写自己的上下文菜单?C#,c#,contextmenu,contextmenustrip,C#,Contextmenu,Contextmenustrip,我觉得默认的ContextMenuStrip非常有限,因为它只能包含按钮,而不能包含控件。 很长一段时间以来,我一直在想这个问题,我已经尝试过了,使用表单,但从未真正奏效 我已经对如何设置整个事件和项目有了自己的想法。我唯一的问题是画法。 当您打开一个ContextMenu(ContextMenuStrip)时,您可以设置它在鼠标光标上的位置,它将在那里,即使这意味着它超出了活动窗体的范围。(因此,我不能将控件类用作继承,因为它们只能将自身绘制为窗体的一部分。 现在我想使用Form类作为我的Co

我觉得默认的ContextMenuStrip非常有限,因为它只能包含按钮,而不能包含控件。 很长一段时间以来,我一直在想这个问题,我已经尝试过了,使用表单,但从未真正奏效

我已经对如何设置整个事件和项目有了自己的想法。我唯一的问题是画法。 当您打开一个ContextMenu(ContextMenuStrip)时,您可以设置它在鼠标光标上的位置,它将在那里,即使这意味着它超出了活动窗体的范围。(因此,我不能将控件类用作继承,因为它们只能将自身绘制为窗体的一部分。 现在我想使用Form类作为我的ContextMenu的基础,但是那些在屏幕上随机放置的类

所以我真正需要的是一个类(或类似的类),它可以自己画,没有问题,并且可以准确地放在屏幕上

任何提示都很好,谢谢


Greg the Mad

您的第一个语句是错误的——您可以在ContextMenuStrip中使用文本框或组合框



当鼠标位于“此处键入”框(有时很难单击)中时,设计器会显示一个小的下拉箭头,允许您更改类型。

您的第一条语句为false——您可以在ContextMenuStrip中使用文本框或组合框



当鼠标位于“此处键入”框中时,在设计器中有一个小的下拉箭头(有时很难单击)这将允许您更改类型。

如果您希望允许任何类型的控件在容器内以自顶向下的方式显示为可定位…您始终可以使用FlowLayoutPanel创建自定义控件。使用其属性FlowDirection=TopDown和WrapContents=False以保持垂直方式。这将处理你的“菜单”基础,你的新控件可以从每个控件中显示你想要的任何事件。你必须处理显示面板的逻辑,并用它的Location属性定位


我忘了解决在父窗体外部绘制的问题。请注意,ContextMenu非常智能,当它们到达父窗体的边界时,它们会从父窗体的边界处绘制。从逻辑上讲,您应该能够以正确的方向(上/下或左/右)绘制从任意鼠标右键单击。每次尝试使用表单时,请在调用Show()或ShowDialog()之前设置StartPosition=Manual将其位置属性分别设置为MouseClick事件参数中提供的X和Y参数。

如果您希望允许任何类型的控件在容器内以自顶向下的方式显示为可定位…您始终可以使用FlowLayoutPanel创建自定义控件。使用其属性FlowDirection=TopDown和WrapContents=False以保持垂直方式。这将处理“菜单”基础,新控件可以从每个控件中显示任何事件。您还必须处理显示面板的逻辑以及使用其位置属性进行定位


我忘了解决在父窗体外部绘制的问题。请注意,ContextMenu非常智能,当它们到达父窗体的边界时,它们会从父窗体的边界处绘制。从逻辑上讲,您应该能够以正确的方向(上/下或左/右)绘制从任意鼠标右键单击。每次尝试使用表单时,请在调用Show()或ShowDialog()之前设置StartPosition=Manual根据MouseClick的事件参数中提供的X和Y参数设置它的位置属性。

太好了,我不知道StartPosition属性。我想使用表单,因为我不只是想创建一个下拉菜单,而是一种新的方法。我希望光标位于菜单的中心,周围是图标的小图片trols。如果您将鼠标悬停在其中一个上,它会显示其名称/功能,并通过单击将其放大,以便您可以在菜单中设置任何类型的值。谢谢,:)Greg the MadGreat,我不知道StartPosition属性。我想使用表单,因为我不只是想制作一个下拉菜单,而是一种新的方法。我希望光标位于菜单的中心,周围是控件的小图片。如果您将鼠标悬停在一个菜单上,它将显示其名称/功能,并通过单击将其放大,以便您可以在菜单中设置任何类型的值。谢谢,:)疯狂的格雷格