【发布时间】: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 方法来获取坐标。大概,您将这些坐标存储在一些表单全局变量中以供上下文菜单使用,以便它知道将新形状放在哪里。
标签: c# winforms contextmenu toolstripitem