【问题标题】:VB Downscaling coordinatesVB 缩小坐标
【发布时间】:2016-03-06 00:05:17
【问题描述】:

我需要知道鼠标点击 gdi+ 绘制的线的时间。

我已经制作了这个函数,它在所有现有行的循环中使用,该函数的作用是:

  1. 它会根据行的容器大小制作一个缓冲区
  2. 它使整个东西变黑了
  3. 它用绿色画线
  4. 获取鼠标位置的像素
  5. 如果像素不同于黑色(也称为绿色),则表示已成功单击该行,然后该函数应返回 true。

这很好用,没有误解,但我担心当我的表单全屏时(由于缓冲区很大)会有一点延迟(不是很明显)。

我正在寻找一种方法来优化它,我的第一个想法是缩小所有内容。所以我的意思是让缓冲区像 20x20 一样,然后使用数学在缩小的版本中画线。问题是,我数学很烂,所以我基本上是在问你如何做到这一点,最好是对傻瓜的解释。

这是函数:

Public Function Contains(ByVal e As Point) As Boolean
    Dim Width As Integer = Container.Size.Width
    Dim Height As Integer = Container.Size.Height

    Dim Buffer As Bitmap = New Bitmap(Width, Height)
    Using G As Graphics = Graphics.FromImage(Buffer)
        G.Clear(Color.Black)

        Dim Start As Point = New Point(ParentNode.Location.X + ParentNode.Size.Width / 2, ParentNode.Location.Y + ParentNode.Size.Height / 2)
        Dim [End] As Point = New Point(ChildNode.Location.X + ChildNode.Size.Width / 2, ChildNode.Location.Y + ChildNode.Size.Height / 2)

        Dim Control1 As Point
        Dim Control2 As Point
        Control1.X = Start.X + GetAngle(ChildNode.Location, ParentNode.Location, ChildNode.Location.X - ParentNode.Location.X, ChildNode.Location.Y - ParentNode.Location.Y)
        Control1.Y = Start.Y

        Control2.X = [End].X
        Control2.Y = Start.Y

        G.DrawBezier(New Pen(Color.Green, 4), Start, Control1, Control2, [End])
    End Using

    If Buffer.GetPixel(e.X, e.Y).ToArgb() <> Color.Black.ToArgb() Then
        Return True
    End If

    Return False
End Function

这是我尝试使函数使用上述想法的一种尝试:

Public Function Contains(ByVal e As Point) As Boolean
    Dim Width As Integer = 20
    Dim Height As Integer = 20

    Dim Buffer As Bitmap = New Bitmap(Width, Height)
    Using G As Graphics = Graphics.FromImage(Buffer)
    G.Clear(Color.Black)

    Dim Start As Point = New Point(ParentNode.Location.X + ParentNode.Size.Width / 2, ParentNode.Location.Y + ParentNode.Size.Height / 2)
    Dim [End] As Point = New Point(ChildNode.Location.X + ChildNode.Size.Width / 2, ChildNode.Location.Y + ChildNode.Size.Height / 2)

    Dim Control1 As Point
    Dim Control2 As Point
    Control1.X = Start.X + GetAngle(ChildNode.Location, ParentNode.Location, ChildNode.Location.X - ParentNode.Location.X, ChildNode.Location.Y - ParentNode.Location.Y)
    Control1.Y = Start.Y

    Control2.X = [End].X
    Control2.Y = Start.Y

    G.DrawBezier(New Pen(Color.Green, 4), New Point(Start.X / Width, Start.Y / Height), New Point(Control1.X / Width, Control1.Height / Height), New Point(Control2.X / Width, Control2.Y / Height), New Point([End].X / Width, [End].Y / Height))
End Using

If Buffer.GetPixel(Width, Height).ToArgb() <> Color.Black.ToArgb() Then
    Return True
End If

Return False
End Function

【问题讨论】:

    标签: vb.net line gdi+ contains


    【解决方案1】:

    尝试使用GraphicsPath 使用内置的IsOutlineVisible 函数进行绘图和测试:

    Public Function Contains(ByVal e As Point) As Boolean
      Dim result as Boolean = False
      Using gp As New GraphicsPath
        gp.AddBezier(your four points)
        Using p As New Pen(Color.Empty, 4)
          result = gp.IsOutlineVisible(e, p)
        End Using
      End Using
      Return result
    End Function
    

    附注:位图和图形对象需要在创建时进行处理。

    【讨论】:

    • 那是金子!多谢,伙计! - 我不知道还需要处理 Pen、SolidBrush 等图形对象。我认为处理掉图形对象就足够了。
    猜你喜欢
    • 1970-01-01
    • 2019-12-07
    • 2011-06-16
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    相关资源
    最近更新 更多