【问题标题】:VB.NET ContextMenuStrip is not shown at actual location GDI+ controlVB.NET ContextMenuStrip 未显示在实际位置 GDI+ 控件
【发布时间】:2023-03-08 00:16:01
【问题描述】:

我有一个从 ContainerControl 继承的节点图控件,并在其中绘制了一个节点列表,这些节点不会从任何地方继承,而只是由一些方法和一些属性组成。

我需要能够右键单击一个节点,然后在该位置显示一个 ContextMenuStrip。我可以做的很好,但是问题开始在于节点图控制缩放内容的能力。

当控件被放大时,ContextMenuStrip 会发生偏移。我应该注意这一点,因为我能够正确找出鼠标坐标是否在节点范围内,但由于某种原因,ContextMenuStrip 没有显示在鼠标坐标处。

这是一个展示问题的视频: https://youtu.be/QNqQnWSENN8

非常抱歉,由于这些愚蠢的限制,我无法发布我的大部分代码,所以我将尝试提供与问题相关的内容。

所以我目前在节点图的 MouseDown 事件上做的是:

Public Overrides Sub OnMouseDown(e As MouseEventArgs)
    Dim selectedNode = From n As Node In NodeContainer.Nodes Where n.Rectangle.Contains(e.Location) Select n
    If selectedNode.Count = 1 Then
        If NodeContainer.SelectedNodes.Count < 2 Then : NodeContainer.SelectNodeContainer() : End If
        NodeContainer.SelectNode(selectedNode.LastOrDefault(), False)
        NodeContainer.NodeContextMenuStrip.Show(NodeContainer, e.Location) 'Show node cms
    Else
        NodeContainer.SelectNodeContainer()
        NodeContainer.NodeContainerContextMenuStrip.Show(NodeContainer, e.Location) 'Show container cms
    End If
End Sub

该方法被赋予此 MouseEventArgs 对象:

Dim ev As New MouseEventArgs(e.Button, e.Clicks, (e.X - AutoScrollPosition.X) / Zoom, (e.Y - AutoScrollPosition.Y) / Zoom, e.Delta)

这基本上就是我在 atm 上的做法。

我尝试了几件事:

  1. 从 show 方法中删除 NodeContainer 并将位置转换为屏幕坐标,但这不起作用,至少不是我这样做的方式。

  2. 我已经尝试将节点位置和大小添加到 e.Location 中,显然也没有用。

希望你能帮忙,谢谢。

【问题讨论】:

    标签: c# vb.net controls gdi+


    【解决方案1】:

    解决方案是给方法原始的 MouseEventArgs 对象,然后在方法中创建新的 MouseEventArgs 对象。

    所以(前后带 * 的行要么被插入,要么被改变):

    Public Overrides Sub OnMouseDown(e As MouseEventArgs)
    *Dim ev As New MouseEventArgs(e.Button, e.Clicks, (e.X - AutoScrollPosition.X) / Zoom, (e.Y - AutoScrollPosition.Y) / Zoom, e.Delta)*
    
    Dim selectedNode = From n As Node In NodeContainer.Nodes Where n.Rectangle.Contains(*ev.Location*) Select n
    If selectedNode.Count = 1 Then
        If NodeContainer.SelectedNodes.Count < 2 Then : NodeContainer.SelectNodeContainer() : End If
        NodeContainer.SelectNode(selectedNode.LastOrDefault(), False)
        NodeContainer.NodeContextMenuStrip.Show(NodeContainer, e.Location) 'Show node cms
    Else
        NodeContainer.SelectNodeContainer()
        NodeContainer.NodeContainerContextMenuStrip.Show(NodeContainer, e.Location) 'Show container cms
    End If
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      相关资源
      最近更新 更多