Marzo 2003
Eventos
El objeto Region nos regala el método IsVisible, que toma un punto o un rectángulo como argumento y nos devuelve un valor booleano que nos indica si ese punto o esa área rectangular son visibles en la pantalla y pertenecen a la región. Si aun siendo visibles no pertenecen a la región, devuelve False. Por tanto, si le entregamos el punto en que está situado el ratón, sabremos si está posicionado encima de la región. Esto nos permite reaccionar ante, por ejemplo, un click sobre una determinada figura. Vamos a ofrecer un ejemplo. Aprovechando la creación anterior, vamos a añadir el procedimiento de evento Sub Form1_MouseUp, que contiene en su parámetro e el punto sobre el que está colocado el botón, y vamos a discriminar sobre cuál de las tres tuberías azules ha hecho click el usuario:
Private MY As Decimal, Barra As Decimal
‘Hemos añadido las siguientes líneas
‘al final del Procedimiento “DibujaTuberías”
‘TuberíasAzules = ClipRegion
‘MY = MargenY
Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
Try
If TuberíasAzules.IsVisible(e.X, e.Y) Then 'Posición del ratón
Dim orden As String
Select Case e.Y
Case Is < MY + Barra * 2 'Primer tubo
orden = "primera"
Exit Select
Case Is < MY + Barra * 4 'Segundo tubo
orden = "segunda"
Exit Select
Case Is < MY + Barra * 6 'Tercer tubo
orden = "tercera"
Exit Select
End Select
MessageBox.Show(String.Format("Click sobre la {0} tubería azul", orden))
End If
Catch x As Exception
'MessageBox.Show(x.ToString)
End Try
End Sub
Al hacer click sobre una barra azul, emerge un MessageBox diciéndonos sobre qué barra hemos hecho click. Tras darle a Aceptar, el rectánculo que ha ocupado se queda en blanco. Para recuperar el dibujo entera hay que volverlo a pintar. Podemos evitarnos esta preocupación añadiendo el procedimiento de evento:
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
DibujaTuberías()
End Sub
Pero el dibujo es demasiado complejo y se producen destellos desagradables. No conocemos manera de evitar este efecto. Y esto es así porque GDI+, como dijimos al principio, no mantiene objetos en el lienzo, sino puntos que diferentes colores.