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 相对于父项的位置的主要内容,如果未能解决你的问题,请参考以下文章