Dibujar con el Mouse

Fecha: 02/Ago/2004 (29/07/04)
Autor: Sergioman --- mail: [email protected]

.

Puede parecer facil el titulo propuesto, pero podemos aprender muchos temas con este reto. A ver piensen un poco cual seria como seria el programa, aver..........., facil, capturo los click del mouse, claro serian dos, uno para el punto inicial y otro para el punto final, listo ahora lo dibujo. Pero como puedo mover esa linea a donde yo quiera?, dibujo una nueva linea, puede ser, muevo el fondo, puede ser, etc. Si quiero mover a la linea creada tengo que tratarla como un objeto, es decir hacer uso de P.O.O. (programacion orientada a objetos).

Auque paresca muy tedioso hacer clases, -si lo puedo hacer en el windows.form, si puede hacer pero la P.O.O, le da muchas caracteristicas a tu programa, cuando mas cresca tu programa no se te hara tan d�ficil si usaste P.O.O. Yo para este programa solo voy a usar dos clases: DrawLine.vb (formulario windows), y Linea.vb.

 

Clase Linea.vb

'---------------------------------
'Clase Linea.vb, primero se la dibuja
'y luego le podemos mover por
'la pantalla, tambien se le puede 
'implementar que cambie de color


Public Class Linea


#Region "Atributos, propiedades o como quieras llamarlos"
   'atributos de la clase
   Private iniX As Integer
   Private iniY As Integer
   Private finX As Integer
   Private finY As Integer

   'lapiz del pincel
   Private myPen As Pen

 
Recordemos que para dibujar cualquier grafico, necesitamos un objeto Graphics, un objeto Pen(pincel), un m�todo de dibujo, y las coordenadas g.DrawLine(myPen,12,26,15,65)
 

   'propiedad pincel
   'Este es una novedad del .Net Framework
   'tu declaras los atributos, y despues su propiedad
   Public Property Pincel() As Pen
      Get
         Return myPen
      End Get
      Set(ByVal Value As Pen)
         myPen = Value
      End Set
   End Property

   'su prpopiedad color
   Public Property Color() As Color
      Get
         Return myPen.Color
      End Get
      Set(ByVal Value As Color)
         myPen.Color = Value
      End Set
   End Property

   'la propiedad ancho
   Public Property Ancho() As Integer
      Get
         Return myPen.Width
      End Get
      Set(ByVal Value As Integer)
         myPen.Width = Value
      End Set
   End Property

   'propiedades medias locas, recien estoy aprendiedo 
   ' a usar
   Public Property pIniX() As Integer
      Get
         Return iniX
      End Get
      Set(ByVal Value As Integer)
         iniX = Value
      End Set
   End Property

   Public Property pIniY() As Integer
      Get
         Return iniY
      End Get
      Set(ByVal Value As Integer)
         iniY = Value
      End Set
   End Property

   Public Property pFinX() As Integer
      Get
         Return finX
      End Get
      Set(ByVal Value As Integer)
         finX = Value
      End Set
   End Property

   Public Property pFinY() As Integer
      Get
         Return finY
      End Get
      Set(ByVal Value As Integer)
         finY = Value
      End Set
   End Property
#End Region


   'constructor
   Public Sub New(ByVal iX As Integer, ByVal iY As Integer, ByVal fX As Integer, ByVal fY As Integer)
      iniX = iX
      iniY = iY
      finX = fX
      finY = fY

      'estableciendo el lapiz por defecto
      myPen = New Pen(Color.Gold, 4)
   End Sub

   'ahora si metodos principales de la clase
   Public Sub Move(ByVal str As String)
      Select Case str
         Case "U"   'mover arriba
            iniY -= 2
            finY -= 2
         Case "D"   'mover abajo
            iniY += 2
            finY += 2
         Case "R"   'mover derecha
            iniX += 2
            finX += 2
         Case "L"   'mover izquierda
            iniX -= 2
            finX -= 2
      End Select
   End Sub

End Class

 

Clase DrawLine.vb

'-------------------------------------------
'Author: [email protected]
'formulario windows
'debe tener un Picture, un boton 
'para activar el movimiento del objeto

Public Class DrawLine
   Inherits System.Windows.Forms.Form

#Region " C�digo generado por el Dise�ador de Windows Forms "

  ....................
#End Region

#Region "variables de sergioman"

   'Flags
   Private dibujar As Boolean = False
   Private dibujando As Boolean = False
   Private mover As Boolean = False

   'mi linea
   Private myLine As Linea

   'mi objeto para dibujar
   Private g As Graphics
#End Region

#Region "mis funciones"
   Public Sub DrawMyLine()

      'creando el objeto
      g = PicFondo.CreateGraphics()

      g.Clear(Color.White)
      'ahora dibujando la lina
      g.DrawLine(myLine.Pincel, myLine.pIniX, myLine.pIniY, myLine.pFinX, myLine.pFinY)
   End Sub
#End Region

   Private Sub CmdDraw_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdDraw.Click
      MsgBox("hacer un click en el Picture, mantenerlo presionado y mover el mouse")
      dibujar = True


      'creando el objeto  a usar
      myLine = New Linea(0, 0, 0, 0)
   End Sub

   '----------------------------------------------
   'Con los tres modos del mouse se dibuja la linea
   Private Sub PicFondo_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicFondo.MouseDown
      If dibujar Then
         If Not dibujando Then
            myLine.pIniX = e.X
            myLine.pIniY = e.Y
            'ya se hizo el primer punto
            dibujando = True
         End If
      End If
   End Sub

   Private Sub PicFondo_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicFondo.MouseMove
      If dibujando Then
         myLine.pFinX = e.X
         myLine.pFinY = e.Y
         Me.DrawMyLine()
      End If
   End Sub

   Private Sub PicFondo_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicFondo.MouseUp
      'se termino de dibujar la linea
      dibujando = False

      'ahora mover la linea
      Me.Panel1.Visible = True
   End Sub
   '--------------------------------------------------

   '----------------------------------------------
   'ahora se lo va amover
   Private Sub CmdMove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdMove.Click
      'ya no crear otra linea
      Me.dibujar = False
      'CmdDraw.Enabled = False

      'cambiar el ancho
      Try
         If (TxtAncho.Text <> "") Then
            myLine.Ancho = Integer.Parse(TxtAncho.Text)
         End If
      Catch er As Exception
         MsgBox("no ingreso un ancho correcto, se tomara el anterior")
      End Try

      'mandano un mensaje
      MsgBox("mover la linea con el teclado")

      'mover 
      Me.mover = True
      'mandando el foco
      Me.TxtKeyCode.Focus()
   End Sub

   Private Sub TxtKeyCode_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TxtKeyCode.KeyDown
      'si se puede mover el objeto
      If Me.mover Then
         Select Case e.KeyCode
            Case Keys.Up
               myLine.Move("U")
               Me.DrawMyLine()
            Case Keys.Down
               myLine.Move("D")
               Me.DrawMyLine()
            Case Keys.Left
               myLine.Move("L")
               Me.DrawMyLine()
            Case Keys.Right
               myLine.Move("R")
               Me.DrawMyLine()
         End Select
      End If

   End Sub
   '------------------------------------------------------
End Class
 

ir al índice

Fichero con el c�digo de ejemplo: sergio_DrawMouse - 17 KB