ToolStripMenuItem 相对于父项的位置

Posted

技术标签:

【中文标题】ToolStripMenuItem 相对于父项的位置【英文标题】:ToolStripMenuItem location relative to parent 【发布时间】:2015-01-28 17:46:41 【问题描述】:

我正在尝试提取 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 应用程序):

【问题讨论】:

这真的是 ToolStrip 吗?当我将工具条拖到我的 Winform 上时,它会自动停靠在窗体顶部,大致对应于 X=0,Y=2。 @RobertHarvey 它停靠在顶部,但这是一个 ToolStripMenuItem(我相信是一个子控件)。 Bound.Location 显然返回与父母相同的位置,我认为这是有道理的,因为这是唯一的孩子,因此也是第一个孩子。遗憾的是无法获取实际渲染图形对象的位置。 实际渲染的图形对象的位置是什么?从逻辑上讲,停靠的工具条对象中的第一个菜单项应该位于工具条的左上角,给或取几个像素。 @RobertHarvey 它根据其容器(在我的情况下为 ContextMenuStrip)折叠了子项(ToolStripMenuItem)。这是一个反问句吗?如果我不明白,我很抱歉。我唯一能想到的就是当用户右键单击并使用它时记住光标的位置。 通常使用工具栏来完成。您单击工具栏上所需的形状,然后单击表面并捕获表面。OnClick(它会为您获取坐标)。右键单击表面(上下文菜单或否)应该以相同的方式工作;您可以通过捕获表面的 OnClick 方法来获取坐标。大概,您将这些坐标存储在一些表单全局变量中以供上下文菜单使用,以便它知道将新形状放在哪里。 【参考方案1】:

上下文菜单不知道您单击的对象的物理位置。那是对象本身的OnClick 事件的范围。因此,如果您希望上下文菜单能够访问单击坐标,则必须挂钩被单击对象的 OnClick 事件,在某些表单全局变量中捕获单击的坐标,然后在你的ContextMenu_Click 事件。

【讨论】:

【参考方案2】:

你可以使用项目宽度,比如这个例子:我想把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);

【讨论】:

以上是关于ToolStripMenuItem 相对于父项的位置的主要内容,如果未能解决你的问题,请参考以下文章

如何确定鼠标相对于父元素的悬停位置

以子菜单项相对于父菜单项将块居中

如何将父项的第一个子项中的属性移动到 XSLT 中的父项?

在物料清单中插入父项的销售价格而不重复

php facetwp索引仅指导父项的子项

php facetwp索引仅指导父项的子项