IMAGEMAP EM VB.NET

JULIOTERRANOVA 17/12/2012 11:03:44
#416061
estou tentando fazer um programa e nele uso a foto de uma íris e queria passar o mouse e ele me falar em q região estou passando, na íris existem várias regiões de formatos irregulares q representam coisas diferentes e vi q o imagemap faz isso mas não consegui usar ele, alguém sabe como fazer

se não expliquei direito me fale q explico melhor
obrigado
PROFESSOR 29/12/2012 14:43:42
#416544
Resposta escolhida
Ok, imagemap do HTML em Winforms...
Segue abaixo uma classezinha que deve resolver bem o problema.
Trata-se de uma adaptação, a idéia é a mesma do HTML, ok ?
Como o Namespace Drawing oferece o componente GraphicPath, é ele quem eu estou usando para prover a funcionalidade de marcação das regiões clicáveis.


Imports System.Collections
Imports System.ComponentModel
Imports System.Drawing
Imports System.Data
Imports System.Windows.Forms

<DefaultEvent([Ô]RegionClick[Ô])> _
<DefaultProperty([Ô]Image[Ô])> _
Public Class ImageMap
Inherits System.Windows.Forms.UserControl
Implements IDisposable

Public Class Item
Public Property Indice As Integer
Public Property Nome As String
Public Property Link As String
End Class

#Region [Ô] Variáveis de trabalho e manutenção [Ô]
Private mDados As System.Drawing.Drawing2D.GraphicsPath
Private mItemAtivo As Integer = -1
Private mItens As New List(Of Item)
Private mDica As ToolTip
Private mPapel As Drawing.Graphics
Private mLink As String = [Ô][Ô]
#End Region

#Region [Ô] Eventos [Ô]
<Category([Ô]Eventos[Ô])>
<Description([Ô]Ocorre sempre que uma região deimitada é clicada.[Ô])>
<DisplayName([Ô]Região clicada[Ô])>
Public Event RegionClick As RegionClickDelegate
#End Region

#Region [Ô] Tratamento da instância [Ô]
Public Sub New()
InitializeComponent()
Me.mItens = New List(Of Item)
Me.mDados = New System.Drawing.Drawing2D.GraphicsPath()
Me.mDados.FillMode = System.Drawing.Drawing2D.FillMode.Winding
Me.components = New Container()
Me.mDica = New ToolTip(Me.components)
Me.mDica.AutoPopDelay = 5000
Me.mDica.InitialDelay = 1000
Me.mDica.ReshowDelay = 500
Me.mPapel = Graphics.FromHwnd(Me.pictureBox.Handle)
MyBase.BackgroundImageLayout = ImageLayout.Stretch
End Sub
#End Region

#Region [Ô] Propriedades públicas [Ô]
<Browsable(True)> _
<Category([Ô]Appearance[Ô])> _
<DisplayName([Ô]ImageLayout[Ô])> _
<Description([Ô]Forma de apresentação da imagem de fundo[Ô])> _
Public Property ImageLayout() As ImageLayout
Get
Return Me.pictureBox.BackgroundImageLayout
End Get
Set(value As ImageLayout)
Me.pictureBox.BackgroundImageLayout = value
End Set
End Property
<Browsable(True)> _
<Category([Ô]Appearance[Ô])> _
<DisplayName([Ô]Image[Ô])> _
<Description([Ô]Imagem de fundo[Ô])> _
Public Property Image() As Image
Get
Return Me.pictureBox.BackgroundImage
End Get
Set(value As Image)
Me.pictureBox.BackgroundImage = value
End Set
End Property
<Browsable(False)> _
<Description([Ô]Imagem de fundo[Ô])> _
<Category([Ô]Appearance[Ô])> _
Public Overrides Property BackgroundImage() As Image
Get
Return MyBase.BackgroundImage
End Get
Set(value As Image)
MyBase.BackgroundImage = value
MyBase.BackgroundImageLayout = ImageLayout.Stretch
End Set
End Property
#End Region

#Region [Ô] Métodos públicos (adição de regiões de clique) [Ô]
[ô][ô][ô] <summary>
[ô][ô][ô] Adiciona uma região de clique com área em formato circular.
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]key[Ô]></param>
[ô][ô][ô] <param name=[Ô]center[Ô]></param>
[ô][ô][ô] <param name=[Ô]radius[Ô]></param>
[ô][ô][ô] <returns></returns>
[ô][ô][ô] <remarks></remarks>
Public Function AddElipse(ByVal key As String,
ByVal link As String,
ByVal center As Point,
ByVal radius As Integer) As Integer
Return Me.AddElipse(key, link, center.X, center.Y, radius)
End Function
[ô][ô][ô] <summary>
[ô][ô][ô] Adiciona uma região de clique com área em formato circular (elíptica).
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]key[Ô]></param>
[ô][ô][ô] <param name=[Ô]x[Ô]></param>
[ô][ô][ô] <param name=[Ô]y[Ô]></param>
[ô][ô][ô] <param name=[Ô]radius[Ô]></param>
[ô][ô][ô] <returns></returns>
[ô][ô][ô] <remarks></remarks>
Public Function AddElipse(ByVal key As String,
ByVal link As String,
ByVal x As Integer,
ByVal y As Integer,
ByVal radius As Integer) As Integer
If Me.mItens.Count > 0 Then
Me.mDados.SetMarkers()
End If
Me.mDados.AddEllipse(x - radius, y - radius, radius * 2, radius * 2)
Dim novoItem As New Item
With novoItem
.Indice = Me.mItens.Count
.Link = link
.Nome = key
End With
Me.mItens.Add(novoItem)
Return (Me.mItens.Count - 1)
End Function
[ô][ô][ô] <summary>
[ô][ô][ô] Adiciona uma região de clique com área em formato retangular.
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]key[Ô]>Nome da área de clique</param>
[ô][ô][ô] <param name=[Ô]x1[Ô]></param>
[ô][ô][ô] <param name=[Ô]y1[Ô]></param>
[ô][ô][ô] <param name=[Ô]x2[Ô]></param>
[ô][ô][ô] <param name=[Ô]y2[Ô]></param>
[ô][ô][ô] <returns></returns>
[ô][ô][ô] <remarks></remarks>
Public Function AddRectangle(ByVal key As String,
ByVal link As String,
ByVal x1 As Integer,
ByVal y1 As Integer,
ByVal x2 As Integer,
ByVal y2 As Integer) As Integer
Return Me.AddRectangle(key, link, New Rectangle(x1, y1, (x2 - x1), (y2 - y1)))
End Function
[ô][ô][ô] <summary>
[ô][ô][ô] Adiciona uma região de clique com área em formato retangular.
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]key[Ô]></param>
[ô][ô][ô] <param name=[Ô]rectangle[Ô]></param>
[ô][ô][ô] <returns></returns>
[ô][ô][ô] <remarks></remarks>
Public Function AddRectangle(ByVal key As String,
ByVal link As String,
ByVal rectangle As Rectangle) As Integer
If Me.mItens.Count > 0 Then
Me.mDados.SetMarkers()
End If
Me.mDados.AddRectangle(rectangle)
Dim novoItem As New Item
With novoItem
.Indice = Me.mItens.Count
.Link = link
.Nome = key
End With
Me.mItens.Add(novoItem)
Return (Me.mItens.Count - 1)
End Function
[ô][ô][ô] <summary>
[ô][ô][ô] Adiciona uma região de clique com área em forma de polígono irregular.
[ô][ô][ô] </summary>
[ô][ô][ô] <param name=[Ô]key[Ô]></param>
[ô][ô][ô] <param name=[Ô]points[Ô]></param>
[ô][ô][ô] <returns></returns>
[ô][ô][ô] <remarks></remarks>
Public Function AddPolygon(ByVal key As String,
ByVal link As String,
ByVal points As Point()) As Integer
If Me.mItens.Count > 0 Then Me.mDados.SetMarkers()
Me.mDados.AddPolygon(points)
Dim novoItem As New Item
With novoItem
.Indice = Me.mItens.Count
.Link = link
.Nome = key
End With
Me.mItens.Add(novoItem)
Return (Me.mItens.Count - 1)
End Function
#End Region

#Region [Ô] Métodos de suporte e mapeamento de eventos [Ô]
Public Delegate Sub RegionClickDelegate(index As Integer, key As String, link As String)
Private Sub pictureBox_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles pictureBox.MouseMove
Dim newIndex As Integer = Me.getActiveIndexAtPoint(New Point(e.X, e.Y))
If newIndex > -1 Then
pictureBox.Cursor = Cursors.Hand
If Me.mItemAtivo <> newIndex Then Me.mDica.SetToolTip(Me.pictureBox, CType(Me.mItens(newIndex), Item).Nome)
Else
pictureBox.Cursor = Cursors.[Default]
Me.mDica.RemoveAll()
End If
Me.mItemAtivo = newIndex
End Sub
Private Sub pictureBox_MouseLeave(sender As Object, e As System.EventArgs) Handles pictureBox.MouseLeave
Me.mItemAtivo = -1
Me.Cursor = Cursors.[Default]
End Sub
Private Sub pictureBox_Click(sender As Object, e As System.EventArgs) Handles pictureBox.Click
Static nClick As Boolean = False
Dim p As Point = Me.PointToClient(Cursor.Position)
If (Me.mItemAtivo = -1) Then Me.getActiveIndexAtPoint(p)
If ((Me.mItemAtivo > -1) AndAlso (nClick = False)) Then
nClick = True
Dim itm = (From k As Item In Me.mItens Where k.Indice = Me.mItemAtivo Select k).FirstOrDefault
If itm IsNot Nothing Then
RaiseEvent RegionClick(itm.Indice,
itm.Nome,
itm.Link)
nClick = False
End If
End If
End Sub
Private Function getActiveIndexAtPoint(point As Point) As Integer
Dim path As New System.Drawing.Drawing2D.GraphicsPath()
Dim iterator As New System.Drawing.Drawing2D.GraphicsPathIterator(mDados)
iterator.Rewind()
For current As Integer = 0 To iterator.SubpathCount - 1
iterator.NextMarker(path)
If path.IsVisible(point, Me.mPapel) Then Return current
Next
Return -1
End Function
#End Region
End Class


Depois de gerar (build), no seu formulário já estará disponível o [Ô]novo componente[Ô], o ImageMap, ok?
PROFESSOR 29/12/2012 14:52:46
#416545
Continuando:

Para usar, então, no formulário, você deve primeiro criar as regiões clicáveis, o que é mais ou menos assim:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
With Me.ImageMap1
[ô]Cria uma região no canto superior esquerdo.
.AddRectangle([Ô]Google[Ô], [Ô]http://www.google.com[Ô], 0, 0, .Width / 2, .Height / 2)
[ô]Canto inferior direito.
.AddRectangle([Ô]MSDN[Ô], [Ô]http://www.msdn.com[Ô], .Width / 2, .Height / 2, .Width, .Height)
End With
End Sub


E depois é só utilizar o evento RegionClick, por exemplo:

    Private Sub ImageMap1_RegionClick(index As Integer, key As String, link As String) Handles ImageMap1.RegionClick
If link.Trim.Length > 0 Then
MsgBox(String.Format([Ô]Você clicou no link {0}, [ô]{1}[ô], deveria navegar para [ô]{2}[ô].[Ô], index + 1, key, link))
Else
MsgBox(String.Format([Ô]Você clicou no link {0}, [ô]{1}[ô].[Ô], index + 1, key))
End If
End Sub


Ou ainda, se pretender navegar via http, como seria o esperado, algo como:

 
Private Sub ImageMap1_RegionClick(index As Integer, key As String, link As String) Handles ImageMap1.RegionClick
If link.Trim.Length > 0 Then
Process.Start(link)
Else
MsgBox(String.Format([Ô]Você clicou no link {0}, [ô]{1}[ô].[Ô], index + 1, key))
End If
End Sub
JULIOTERRANOVA 28/01/2013 19:03:58
#418258
Olá Professor, tinha até esquecido desse tópico, estou tentando usar ele mas dessa parte q trabalha com imagem, tem algum arquivo para download para eu entender melhor?

Obrigado
Tópico encerrado , respostas não são mais permitidas