How to get image coordinates on a windows form and make sections clickable

Posted on 2012-03-13
Last Modified: 2012-03-30
Hello experts,
I am making a visual studio 2008 windows form.  Within the form i have a picture box, with an image set to fill the entire control.  I want to make certain portions of the image clickable.
First i need to get the coordinates of the mouse location, than define my rectangles on the image.  Has anyone done this.  I know in html you can use code like this:
<img src ="planets.gif" width="145" height="126" alt="Planets" usemap ="#planetmap" />

<map id ="planetmap" name="planetmap">
<area shape ="rect" coords ="0,0,82,126" href ="sun.htm" alt="Sun" />
<area shape ="circle" coords ="90,58,3" href ="mercur.htm" alt="Mercury" />
<area shape ="circle" coords ="124,58,8" href ="venus.htm" alt="Venus" />

Here is my window form code to get the mouse location of the click
'This code keeps the form from being moved, which will change the location of the mouse click
 Protected Overloads Overrides Sub WndProc(ByRef m As Message)
        Const WM_NCLBUTTONDOWN As Integer = 161
        Const WM_SYSCOMMAND As Integer = 274
        Const HTCAPTION As Integer = 2
        Const SC_MOVE As Integer = 61456
        If (m.Msg = WM_SYSCOMMAND) AndAlso (m.WParam.ToInt32() = SC_MOVE) Then
            Exit Sub
        End If

        If (m.Msg = WM_NCLBUTTONDOWN) AndAlso (m.WParam.ToInt32() = HTCAPTION) Then
            Exit Sub
        End If
    End Sub

    Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
        x = System.Windows.Forms.Control.MousePosition.X
        y = System.Windows.Forms.Control.MousePosition.Y
        MessageBox.Show("You clicked x cor: " & x & "  You Clicked y cord: " & y)
    End Sub
Question by:skyzipper
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
LVL 40

Expert Comment

by:Kyle Abrahams
ID: 37715296
Is the image static?  Can you draw an invisible panel over the image?  Then on mouse enter of the panel you can set the cursor.  When exiting set it back to default.

Then each region has it's own event, which makes your code a lot easier to manage.

What's the "end game"?  (EG: what are you doign with the regions?  What happens on the clicks, etc)
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 37715587
You can create a GraphicsPath() instance that represents each "hot spot" on your image:

Next, create a Region() from those GraphicsPath() instances:

Finally, you can use the Region.IsVisible() function to determine if the cursor is contained by one of the hot spots:

Author Comment

ID: 37716152
ged225, i tried using panels, but when i set the background to transparent it still covers the image and if i set its z axis to behind the images, none of the panel's events fire.  I will have to try idle_minds.

Author Comment

ID: 37716293
Not sure the regions will work either, how to i mouse event hander?
LVL 86

Accepted Solution

Mike Tomlinson earned 320 total points
ID: 37716778
Here's a simple example that highlights the GraphicsPath when the mouse is within:
Imports System.Drawing.Drawing2D
Public Class Form1

    Private CurPath As Integer = -1
    Private Regions As New List(Of Region)
    Private Paths As New List(Of GraphicsPath)

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim gp As New GraphicsPath
        gp.AddEllipse(New Rectangle(50, 50, 125, 75))
        Regions.Add(New Region(gp))

        gp = New GraphicsPath
        gp.AddPolygon(New Point() {New Point(250, 250), New Point(325, 300), New Point(175, 275)})
        Regions.Add(New Region(gp))

        gp = New GraphicsPath
        gp.AddClosedCurve(New Point() {New Point(400, 125), New Point(425, 175), New Point(500, 225), New Point(375, 200)})
        Regions.Add(New Region(gp))
    End Sub

    Private Sub PictureBox1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        For i As Integer = 0 To Paths.Count - 1
            e.Graphics.DrawPath(IIf(CurPath = i, Pens.Red, Pens.Black), Paths(i))
    End Sub

    Private Sub PictureBox1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        Dim Hit As Boolean = False
        For i As Integer = 0 To Regions.Count - 1
            If Regions(i).IsVisible(e.X, e.Y) Then
                Hit = True
                If CurPath <> i Then
                    CurPath = i
                    Exit For
                End If
            End If
        If Not Hit Then
            CurPath = -1
        End If
    End Sub

End Class

Open in new window

The mouse is over the squiggle shape thing...

Featured Post

Tutorials alone can't teach real engineering

So we built better training tools.

-Hands-on Labs
-Instructor Mentoring
-Scenario-Based Tests
-Dedicated Cloud Servers

All at your fingertips. What are you waiting for?

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Today I had a very interesting conundrum that had to get solved quickly. Needless to say, it wasn't resolved quickly because when we needed it we were very rushed, but as soon as the conference call was over and I took a step back I saw the correct …
Whether you've completed a degree in computer sciences or you're a self-taught programmer, writing your first lines of code in the real world is always a challenge. Here are some of the most common pitfalls for new programmers.
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA.…
Michael from AdRem Software explains how to view the most utilized and worst performing nodes in your network, by accessing the Top Charts view in NetCrunch network monitor ( Top Charts is a view in which you can set seve…

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question