ContextMenuStrip 定位点

ContextMenuStrip Location Point

如何在 PictureBox 上的鼠标右键 down/clicked 上以编程方式打开 ContextMenuStrip


我只需要在 PictureBoxImage(时间表)的某些区域打开 ContextMenuStrip,所以我断开了 PictureBox.ContextMenuStrip 属性来自 ContextMenuStrip1 并且我正在手动触发它。这意味着我需要提供一个观点,这似乎非常具有挑战性。

我的问题类似于“”,但我需要同时考虑垂直和水平滚动,但事实并非如此(除非我搞砸了什么)。

所以当我尝试这样的事情时(在 PictureBoxPlan.MouseDown 中):

Dim rpt As Point = Me.PointToClient(PictureBoxPlan.Parent.PointToScreen(e.Location))

...它有一个根本性的缺陷,因为 e.LocationImage 的上下文中,无论它如何在 PictureBox 中滚动。我尝试 Form.MouseDown 事件,但当 [right] 单击 PictureBox.

时,它没有被触发

为了确认,我还需要PictureBox上下文中的点来分析是否应该显示ContextMenuStrip并查找关联的ID。

我现在正在尝试使用一些常量(如果 windows“字体大小”设置为非 100%,则可能不起作用)和滚动条值,这根本不是最佳选择。

好的,我在 ContextMenuStrip.Show(Point) 文档中找到了破坏逻辑的地方:

Show(Point)   
Positions the `ToolStripDropDown` relative to the specified screen location.

所以令我惊讶的是,ContextMenuStrip 采用 screen 坐标,而不是 Form 坐标。然后我就删除了 PointToClient 并且一切都很好用,无论屏幕上的 window 位置或 Image 容器的滚动条位置如何:

Dim rpt As Point = PictureBoxPlan.PointToScreen(New Point(e.Location.X, e.Location.Y))

无需考虑 PanelPlan.VerticalScroll.ValuePanelPlan.HorizontalScroll.Value