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
  • 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 85

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 85

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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Creating an analog clock UserControl seems fairly straight forward.  It is, after all, essentially just a circle with several lines in it!  Two common approaches for rendering an analog clock typically involve either manually calculating points with…
Parsing a CSV file is a task that we are confronted with regularly, and although there are a vast number of means to do this, as a newbie, the field can be confusing and the tools can seem complex. A simple solution to parsing a customized CSV fi…
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.…
Learn how to create flexible layouts using relative units in CSS.  New relative units added in CSS3 include vw(viewports width), vh(viewports height), vmin(minimum of viewports height and width), and vmax (maximum of viewports height and width).

910 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

Need Help in Real-Time?

Connect with top rated Experts

27 Experts available now in Live!

Get 1:1 Help Now