如何在每次使用vb.net单击鼠标按钮时放置/放置图像?

如何在每次使用vb.net单击鼠标按钮时放置/放置图像?,vb.net,Vb.net,我看了“如何在Javascript中单击鼠标放置图像?”但它有一小段Java代码;远远超过我对Java的了解。这是过去一周我最接近找到答案的一次 以下是我想做的(不知道是否可能): 我有一个面板和一个带3个按钮的工具条。每个按钮代表不同的图像。我想点击一个按钮(一次),然后移动到面板中,每次我点击鼠标按钮,它就会将图像放在我点击过的地方。这仅在我单击同一按钮或其他按钮时结束。我不想每次都将图像拖到面板中。换句话说,按钮保持按下状态,事件/动作保持激活状态 任何帮助都将不胜感激。对于按钮UI,请查

我看了“如何在Javascript中单击鼠标放置图像?”但它有一小段Java代码;远远超过我对Java的了解。这是过去一周我最接近找到答案的一次

以下是我想做的(不知道是否可能): 我有一个面板和一个带3个按钮的工具条。每个按钮代表不同的图像。我想点击一个按钮(一次),然后移动到面板中,每次我点击鼠标按钮,它就会将图像放在我点击过的地方。这仅在我单击同一按钮或其他按钮时结束。我不想每次都将图像拖到面板中。换句话说,按钮保持按下状态,事件/动作保持激活状态


任何帮助都将不胜感激。

对于按钮UI,请查看单选按钮/复选框的替代样式。他们有一个“切换按钮”模式,听起来正是你需要的

您可以在面板上检测鼠标按下事件、获取坐标、创建图像控件以及在其中放置图像副本,但有更好的方法

使用单个图像控件填充面板(填充以便处理大小调整,图像控件应始终与面板大小相同)。创建一个与图像控件大小相同的新位图,并将其与之关联(设置图像属性)。获取位图的图形对象(我想是Graphics.FromImage()。用背景色(color.White?)清除它

在启动时预装三个图像,并编写代码在它们之间切换,每次选择不同的按钮时选择“活动的一个”。在鼠标按下事件中,您可以轻松获得单击的坐标。使用myGraphics.DrawImage(…)将该位置的活动图像绘制到位图上。然后,您可以将位图保存到文件中,或对其执行任何操作。所有这些概念都有很多例子,用谷歌搜索


如果您想在“删除”图像后与图像进行交互(如再次移动图像或其他),则需要维护一个数据结构,以跟踪您删除的内容和位置。一个具有点和图像引用的简单类就足够了。每一次拖放都应该向这些对象的列表中添加一个条目。然后,您可能需要编写代码,例如“哪个图像位于当前鼠标位置下?”。这可以通过迭代列表并进行点/矩形相交测试来实现。

这里是一个示例应用程序。它只是一个表单,上面有一个ToolStrip,还有几个按钮,每个按钮上都添加了一个图像。每个按钮的键属性是
CheckOnClick=True
,它将保持按钮按下

ToolStrips没有类似单选按钮的功能,因此您必须自己“取消选中”其他ToolStripButtons,这是我在
ItemClicked
事件中处理的

Public Class Form1
  Private _ActiveImage As Image = Nothing

  Private Class ImagePoint
    Public Location As Point
    Public Image As Image

    Public Sub New(ByVal image As Image, ByVal location As Point)
      Me.Image = image
      Me.Location = location
    End Sub
  End Class

  Private _Images As New List(Of ImagePoint)

  Public Sub New()
    InitializeComponent()
    Me.DoubleBuffered = True
  End Sub

  Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
    For Each imageItem As ImagePoint In _Images
      e.Graphics.DrawImage(imageItem.Image, imageItem.Location)
    Next
  End Sub

  Private Sub ToolStrip1_ItemClicked(ByVal sender As Object, ByVal e As ToolStripItemClickedEventArgs) Handles ToolStrip1.ItemClicked
    For Each toolButton As ToolStripButton In ToolStrip1.Items.OfType(Of ToolStripButton)()
      If toolButton.CheckOnClick Then
        If e.ClickedItem.Equals(toolButton) Then
          _ActiveImage = e.ClickedItem.Image
        Else
          toolButton.Checked = False
        End If
      End If
    Next
  End Sub

  Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseDown
    If _ActiveImage IsNot Nothing AndAlso e.Button = MouseButtons.Left Then
      _Images.Add(New ImagePoint(_ActiveImage, e.Location))
      Me.Invalidate()
    End If
  End Sub
End Class
本例只使用一个简单的类来保存图像放置在什么位置,绘制事件只是在列表中循环并绘制图像


如果将来要删除图像,则在绘制任何图像之前,您必须调用
e.Graphics.Clear(Color.White)

根据个人经验,在每次绘制事件中从头开始重新绘制所有内容通常是一个坏主意,但最简单的场景除外。当某些东西被拖到表单上时,通常会出现大量闪烁并执行大量无用的工作。一次将其绘制为位图是一种方法。但除此之外,我的答案中描述的代码基本上都是你写的。所以+1@colithium这就是为什么我作弊并在构造函数中添加了
Me.DoubleBuffered=True
。:-)+1右后卫。谢谢你的快速回复。我是一个新手,所以我复制了您的代码并插入了toolstrip1以查看我会得到什么错误或线索。我想我会想出如何在哪里添加图像;但什么都没有发生……没有错误或线索。那么,您能给我展示一个代码中有一个图像的示例吗?@UBel在设计器中,向ToolStrip添加两个或三个ToolStripButton。如果单击ToolStrip组件,ToolStrip应该显示一个小的下拉控件。点击它并选择“按钮”。有了按钮后,单击每个按钮,然后在“属性”窗口中,将
CheckOnClick
属性设置为True a,然后双击
Image
属性以选择图像。您可能想将
显示样式更改为“图像”。@LarsTech您真是个天才!非常感谢你。我现在将查看代码,以了解如何将目标从表单更改为面板。最后一个问题..我将需要删除你预测的图像;那么我在哪里使用e.Graphics.Clear(颜色.白色)?你回答了我的问题,我该如何评价你呢?这只是一个复选标记还是更多?谢谢您的快速回复。您能提供一个代码片段示例吗。我是一个新手,不知道如何执行你的建议。
Private Sub ToolStripSound_Click(sender As Object, e As EventArgs) Handles ToolStripSound.Click

    If ToolStripSound.Checked = False Then
        ToolStripSound.Checked = True
    Else
        ToolStripSound.Checked = False
    End If


End Sub

Private Sub ToolStripSound_CheckedChanged(sender As Object, e As EventArgs) Handles ToolStripSound.CheckedChanged

    ' ToolStripSound.Checked = True
    If ToolStripSound.Checked = True Then
        Me.ToolStripSound.Image = Global.Traffic_Lights.My.Resources.Resources.Oxygen_Icons_org_Oxygen_Status_audio_volume_high
    Else
        Me.ToolStripSound.Image = Global.Traffic_Lights.My.Resources.Resources.Oxygen_Icons_org_Oxygen_Status_audio_volume_muted
    End If

End Sub