Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ToolStripMenuItem相对于父项的位置_C#_Winforms_Contextmenu_Toolstripitem - Fatal编程技术网

C# ToolStripMenuItem相对于父项的位置

C# ToolStripMenuItem相对于父项的位置,c#,winforms,contextmenu,toolstripitem,C#,Winforms,Contextmenu,Toolstripitem,我试图提取ToolStripMenuItem在屏幕上呈现时相对于其父对象位置的左上角坐标。有一个Bounds属性有一个Location成员,但它返回关于其实际位置的无意义(至少在我看来)信息 “单击”事件处理程序如下所示: private void newShapeOption_Click(object sender, EventArgs e) { ToolStripMenuItem item = sender as ToolStripMenuItem; Point point

我试图提取ToolStripMenuItem在屏幕上呈现时相对于其父对象位置的左上角坐标。有一个Bounds属性有一个Location成员,但它返回关于其实际位置的无意义(至少在我看来)信息

“单击”事件处理程序如下所示:

private void newShapeOption_Click(object sender, EventArgs e)
{
    ToolStripMenuItem item = sender as ToolStripMenuItem;
    Point point = item.Bounds.Location; // returns {X = 0, Y = 2} every time for some reason
    // the rest is unimportant 
}
图像上的红点(Paint skillz;)显示了我要使用的确切位置(父控件是名为“Window 0”的表单控件-它是和MDI应用程序):


上下文菜单不知道您单击的对象上的物理位置。这是对象本身的
OnClick
事件的范围。因此,如果您希望上下文菜单能够访问单击坐标,则必须钩住被单击对象的
OnClick
事件,以某种形式捕获单击坐标的全局变量,然后在
ContextMenu\u click
事件中使用这些值。

您可以使用项目宽度,比如这个例子:我想把label1放在菜单项之后

 int w = 0;
 for (int i = 0; i < menuStrip1.Items.Count; i++)
 {
     w += menuStrip1.Items[i].Width;
 }
 label1.Width = (int)(this.Width - w);
 label1.Location = new Point(w, label1.Location.Y);
intw=0;
对于(int i=0;i
这真的是工具条吗?当我将toolstrip拖到Winform上时,它会自动停靠在窗体顶部,这大致对应于X=0,Y=2。@RobertHarvey它停靠在顶部,但这是ToolStripMenuItem(我相信是一个子控件)。Location显然返回与父对象相同的位置,我想这是有意义的,因为这是唯一的子对象,因此也是第一个。遗憾的是,无法获取实际渲染图形对象的位置。实际渲染图形对象的位置是什么?从逻辑上讲,停靠的toolstrip对象中的第一个菜单项应该位于toolstrip的左上角,给或取几个像素。@RobertHarvey它根据其容器(在我的例子中是ContextMenuStrip)折叠了子项(ToolStripMenuItem)。这是一个反问吗?如果我不明白,我很抱歉。我能想到的唯一一件事就是当用户右键单击并使用光标时记住光标的位置。通常,这样做的方式是使用工具栏。单击工具栏上所需的形状,然后单击曲面并捕获surface.OnClick(获取坐标)。在曲面上单击鼠标右键(关联菜单或“否”)的方式应相同;通过捕捉曲面的OnClick方法获得坐标。假设您将这些坐标存储在某种形式的全局变量中,供上下文菜单使用,以便它知道将新形状放置在何处。