问题描述
如何以编程方式在鼠标右键上的鼠标光标上打开ContextMenuStrip
或在PictureBox
上单击鼠标?
我仅需要在ContextMenuStrip
中Image
(计划)的某些区域中打开PictureBox
,所以我将PictureBox.ContextMenuStrip
属性与{{1} },而我手动将其触发。这意味着我需要提供一个观点,这似乎令人惊讶。
我的问题类似于“ How to get location of ContextMenuStrip”,但我需要考虑垂直和水平滚动,但这不是必须的(除非我弄乱了东西)。
因此,当我尝试这样的操作(在ContextMenuStrip1
中)时:
PictureBoxPlan.MouseDown
...它有一个根本的缺陷,因为Dim rpt As Point = Me.PointToClient(PictureBoxPlan.Parent.PointToScreen(e.Location))
在e.Location
的上下文中,而不管它如何在Image
中滚动。我尝试进行PictureBox
事件,但是当[右键]单击Form.MouseDown
时,事件没有被触发。
为进行确认,我仍然需要PictureBox
上下文中的点来分析是否应显示PictureBox
并查找关联的ID。
我现在正尝试将一些常量(如果将窗口“字体大小”设置为100%以外的其他值)和滚动条值一起使用,这根本不是最佳选择。
解决方法
好的,我在ContextMenuStrip.Show(Point)
文档中发现了破坏逻辑的内容:
Show(Point) Positions the `ToolStripDropDown` relative to the specified screen location.
因此,令我惊讶的是,ContextMenuStrip采用的是 screen 坐标,而不是 Form 坐标。然后,我只是移除了PointToClient
,不管屏幕上的窗口位置还是Image
容器的滚动条位置,一切都可以作为一种魅力:
Dim rpt As Point = PictureBoxPlan.PointToScreen(New Point(e.Location.X,e.Location.Y))
无需考虑PanelPlan.VerticalScroll.Value
或PanelPlan.HorizontalScroll.Value
。