UBel
UBel

Reputation: 71

How can I place/drop an image evertime you click the mouse button using vb.net?

I looked at "How do I place an image with a mouse-click in Javascript?" but it had a small snippet of Java; immensely larger than my knowledge of Java. And that is the closest I've come to finding an answer in the past week.

Here's what I would like to do (don't know if its even possible): I have a panel and a toolstrip with 3 buttons. Each button represents a different image. I want to click on a button (once) and then move into the panel and everytime I click the mouse button it drops the image where ever I clicked. This only ends when either I click back on the same button or one of the other buttons. I do not want to drag an image into the panel each time. In other words the button stays depressed and the event/action stays active.

Any help would be greatly appreciated.

Upvotes: 3

Views: 991

Answers (3)

andy
andy

Reputation: 1

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

Upvotes: 0

LarsTech
LarsTech

Reputation: 81620

Here is an example application. It's just a form with a ToolStrip on it, along with a couple of buttons with an image added to each button. The key property for each button is CheckOnClick=True, which will keep the button pressed down.

There isn't a radio button like feature for ToolStrips, so you have to "uncheck" the other ToolStripButtons yourself, which I have handled in the ItemClicked event.

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

This example just uses a simple class to hold which image was placed at what location and the paint event just loops through the list and paints the image.

If deleting images is in your future, then you would have to call e.Graphics.Clear(Color.White) before painting any images.

Upvotes: 2

colithium
colithium

Reputation: 10327

For the button UI, check out the alternate style for radio buttons/check boxes. They have a "toggle button" mode which sounds like exactly what you need.

You could go through the motions of detecting mouse down events on the panel, getting the coordinates, creating an image control, and placing a copy of the image in it, but there's a better approach.

Fill the panel with a single image control (fill so that it handles resizes, the image control should always be the same size as the panel). Create a new Bitmap the same size as the image control and associate it with it (set the Image property). Obtain a Graphics object for the Bitmap (Graphics.FromImage() I think). Clear() it with the background color (Color.White?).

Preload your three images on startup and write the code to toggle between them, selecting the "active one" every time a different button is selected. On the mouse down event, you can get the coordinates of the click easily. Use myGraphics.DrawImage(...) to draw the active image at that location onto the Bitmap. You can then save the Bitmap to a file or do whatever you want with it. All of these concepts have lots of examples, Google them.

If you want to interact with the images after you "drop" them (like move them around again or something), then you will need to maintain a data structure that tracks what and where you've dropped. A simple class that has a Point and Image reference will be sufficient. Each drop should add an entry to a List(Of ...) these objects. You'll probably then need to write code such as "which image is under the current mouse location?". This can be accomplished by iterating through the list and doing point/rectangle intersection testing.

Upvotes: 1

Related Questions