【问题标题】:Add event handler to graphics figure painted将事件处理程序添加到绘制的图形图形
【发布时间】:2013-04-18 06:33:56
【问题描述】:

我知道我可以像这样向按钮、标签和文本框添加事件处理程序:

AddHandler button1.click , AddressOf Subbutton1_click

我实际上可以在 Form Paint 事件中使用图形绘制圆、椭圆、矩形或其他图形:

e.Graphics.DrawEllipse(pen1, 0.0F, 0.0F, 200.0F, 200.0F)

这可行,但是如何为我刚刚绘制的图形添加事件处理程序?

我们将不胜感激。

提前致谢

【问题讨论】:

  • 该图形不是您实例化的对象,它可能引发事件。它只是一个图形基元。您应该构建一个能够绘制自身并引发事件的用户控件。我怀疑这值得麻烦
  • 我知道这不是一个实例化的对象。这就是为什么我想知道这是否可能。无论如何,我想 userControl 应该可以工作,我会试一试,谢谢

标签: vb.net winforms graphics


【解决方案1】:

您可以让一个事件引发另一个事件。让我们从使用 GraphicsPath 存储形状并绘制它的基本表单开始:

Imports System.Drawing.Drawing2D

Public Class Form1

    Private Shape As GraphicsPath

    Public Sub New()
        InitializeComponent()
        Shape = New GraphicsPath()
        Shape.AddEllipse(0, 0, 200.0F, 200.0F)
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.DrawPath(Pens.Black, Shape)
        MyBase.OnPaint(e)
    End Sub
End Class

现在您要添加一个事件,以便其他类可以看到被点击的形状:

Public Event ShapeClick As EventHandler

您编写了一个引发事件的受保护虚拟方法,这是标准 .NET 事件引发模式的一部分:

Protected Overridable Sub OnShapeClick(ByVal e As EventArgs)
    '--- Note: you can write code here to respond to the click
    RaiseEvent ShapeClick(Me, e)
End Sub

并且您需要注意用户点击表单。您将检查形状是否被单击,如果是这种情况,则引发事件:

Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
    If Shape.IsVisible(e.Location) Then OnShapeClick(EventArgs.Empty)
    MyBase.OnMouseUp(e)
End Sub

【讨论】:

    【解决方案2】:

    您可以拦截窗口或视图(等等...,我不知道您在使用什么)单击事件,因此每次单击某个位置时都会调用该函数。

    并在该点击事件中检查它是否在您的自定义绘制元素内。不过,您需要先保存元素属性,这将使用大量资源来遍历所有元素。

    我不知道这在您的情况下是否可以接受,也不知道您实际想要完成什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多