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

Posted on 2012-03-13
Medium Priority
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 1280 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

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
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. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
Have you created a query with information for a calendar? ... and then, abra-cadabra, the calendar is done?! I am going to show you how to make that happen. Visualize your data!  ... really see it To use the code to create a calendar from a q…

770 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