我想在 StatusStrip 中 ToolStripStatusLabel 的位置显示 ContextMenuStrip。普通控件有 PointToScreen / PointToClient / etc,但由于 ToolStripStatusLabel 是从 Component 派生的,它没有。
任何帮助,将不胜感激。
我想在 StatusStrip 中 ToolStripStatusLabel 的位置显示 ContextMenuStrip。普通控件有 PointToScreen / PointToClient / etc,但由于 ToolStripStatusLabel 是从 Component 派生的,它没有。
任何帮助,将不胜感激。
一个非常非常晚的答案,只是因为我碰巧遇到了同样的问题并用谷歌搜索了这个问题。到目前为止,我发现的最佳解决方案为答案增加了一个很好的转折。这里是:
void toolStripItem_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
var label = (ToolStripItem)sender;
this.contextMenuStrip1.Show(this.mainStatusStrip, label.Bounds.X + e.X, label.Bounds.Y + e.Y);
}
}
将相对于控件 (eX, eY) 的鼠标坐标添加到边界坐标使菜单出现在正确的位置。省略此项将显示 ToolStripItem 左上角的菜单。作为记录。
当单击 ToolStripStatusLabel 时,在表单上获得鼠标的正确位置涉及到几个步骤。正如您提到的 ToolStripStatusLabel 没有 PointToClient 或 PointToScreen 方法,但父 StatusStrip 控件有。
尝试:
private void toolStripStatusLabel_MouseDown(object sender, MouseEventArgs e)
{
Point p = e.Location;
p.Offset(toolStripStatusLabel.Bounds.Location);
myContextMenu.Show(StatusStrip.PointToScreen(p));
}
你不能做这样的事情:
int x = label.Bounds.Location.X + statusStrip.Location.X;
int y = label.Bounds.Location.Y + statusStrip.Location.Y;
menu.Show(this, x, y);
查看 ToolStripStatusLabel 的Bounds属性。像这样使用它来做你需要做的事情:
contextMenuStrip1.Show(statusStrip1, toolStripStatusLabel2.Bounds.X, toolStripStatusLabel2.Bounds.Y);