Visual Basic.NET - Crear un control de usuario

   
Vista:

Crear un control de usuario

Publicado por Noemi (4 intervenciones) el 17/11/2008 10:28:50
Hola a todos,
Estoy realizado una aplicación en visual basic 2008 y tengo el siguiente problema. Quiero crear un control de usuario que simule un botón formado por dos imágenes. Es decir, quiero utilizar un control de usuario formado por dos imágenes y que cada una de estas imágenes tenga sus propios eventos. Además, quiero que las imágenes que forman el control sean distintas según el lugar donde se coloque el control. Mis preguntas son:
¿Cómo puedo crearlo dentro del mismo proyecto donde se está desarrollando la aplicación y que además lo pueda utilizar gráficamente (lo coloque en los distintos formularios gráficamente, como el resto de controles de visual)? Con esto quiero evitar crear un proyecto de biblioteca de clases para generar una dll aparte.
Además, ¿cómo puedo acceder a las propiedades individuales de cada imagen?

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Crear un control de usuario

Publicado por Huguin (83 intervenciones) el 17/11/2008 20:05:56
Hola, Crea un proyecto de tipo Libreria de Clasess .dll

la siguiente clase se llama TextNume_Farma
y es un textbox personalizado, que tiene una propiedad llamada, TipoDato luego
agrega otro proyecto de tipo winforms y al hacer referencia al proyecto lireria de clases y ejecutar la aplicacion en panel de herramientas debe aparecer un control llamado TextNume_Farma
y ese control puedes agregar a tu formulario, en el panel propiedades de este control veras la propiedad que le acabas de crear TipoDato (entero, letras, etc ).

Esto es un ejemplo que puede servirte como guia para crear tus controles personalizados.


Public Class TextNume_Farma
Inherits System.Windows.Forms.TextBox
Private soloMayu As Boolean = False
Private nNumeros As Boolean = False
Private nDecimales As Boolean = False
Private sLetras As Boolean = False
Private lnLetNum As Boolean = False
Private _ActiveBorderColor As Color = SystemColors.ControlDarkDark
Private _InactiveBorderColor As Color = SystemColors.ControlDark
Private _BorderColor As Color
Private Const WM_PAINT As Integer = &HF
Private IamON As Boolean
Sub New()
MyBase.BackColor = Color.Ivory
End Sub
' Los tipos de datos válidos para el control
Public Enum TipoDatos
Letras ' Solo Letras
Doble ' Números decimales con notación científica
Moneda ' Números decimales
Entero ' Números enteros
Hexadecimal ' Números hexadecimales
Octal ' Números octales
Binario ' Números binarios
Let_Num
End Enum

' Array para los dígitos válidos
Protected digitos() As Char
'
Private _tipoDato As TipoDatos
'
' El tipo de datos que admite el control
Public Overridable Property TipoDato() As TipoDatos
Get
Return _tipoDato
End Get
Set(ByVal value As TipoDatos)
' cambiar el array para que solo acepte los valores indicados
Dim s As String
_tipoDato = value
Select Case _tipoDato
Case TipoDatos.Binario
s = "01"
Case TipoDatos.Entero
s = "0123456789"
Case TipoDatos.Hexadecimal
s = "0123456789ABCDEFabcdef"
Case TipoDatos.Moneda
s = "0123456789-+,."
Case TipoDatos.Octal
s = "01234567"
Case TipoDatos.Letras
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZÑñabcdefghijklmnopqrstuvwxyz áéíóú"
Case TipoDatos.Let_Num
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZÑñabcdefghijklmnopqrstuvwxyzáéíóú0123456789,.;()/¿?¡!""%&{}[] -_:*+@"
Case Else
s = "0123456789-+,Ee"
End Select
digitos = (s & ChrW(8) & ChrW(13)).ToCharArray
End Set
End Property
' Comprueba si el caracter indicado es uno de los valores aceptados
Protected Overridable Function TeclaValida(ByVal c As Char) As Boolean
Return (Array.IndexOf(digitos, c) > -1)
End Function
Protected Overrides Sub OnKeyPress(ByVal e As KeyPressEventArgs)
If TeclaValida(e.KeyChar) = False Then
e.Handled = True
End If
' Seguimos ejecutando el evento en el control base
MyBase.OnKeyPress(e)
End Sub

Public Property ActiveBorderColor() As Color
Get
Return _ActiveBorderColor
End Get
Set(ByVal Value As Color)
_ActiveBorderColor = Value
End Set
End Property

Public Property InactiveBorderColor() As Color
Get
Return _InactiveBorderColor
End Get
Set(ByVal Value As Color)
_InactiveBorderColor = Value
End Set
End Property

Protected Overrides Sub OnEnter(ByVal e As System.EventArgs)
Try
Me.BackColor = Color.Cornsilk
Me.ForeColor = Color.Black

Catch ex As Exception
Throw
End Try
End Sub

Protected Overrides Sub OnLeave(ByVal e As System.EventArgs)
Try
Me.BackColor = Color.Ivory
Me.ForeColor = Color.Black
Catch ex As Exception
Throw
End Try
End Sub

End Class
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Crear un control de usuario

Publicado por noemi (4 intervenciones) el 18/11/2008 09:30:43
Gracias por tu respuesta, pero de momento no es suficiente.

Voy a contar exactamente en qué consiste el control que quiero hacer y ver así si me podéis ayudar. Quiero crear un control que simule un botón, que será utilizado en toda la aplicación. Este control está formado por dos PictureBox, uno que contiene una imagen y otro que contiene otra como si fuera una etiqueta. A estos dos PictureBos les he creado los eventos MouseDown y MouseUp, que realizan un comportamiento común en toda la aplicación. Además, les he creado una nueva propiedad a cada PictureBos para poder asignar en cada caso las imágenes oportunas según el papel del control a lo largo de aplicación. Hasta ahí todo correcto.

El problema surge cuando quiero controlar el evento click, que en cada sitio tiene un comportamiento distinto, por ejemplo, cada control llama a un formulario distinto. Por ejemplo, tengo un formulario que hace de menú principal y tiene ocho de estos controles simulando ocho botones. Si controlo el evento click del control resultante (del control formado por los PictureBox), únicamente funciona cuando el click se realiza fuera de la zona de los dos PictureBox, si lo realizo dentro de alguno de ellos, no se genera dicho evento.

¿Cómo puedo capturar el evento clic de cada uno de los componentes desde fuera del propio componente? ¿O cómo puedo personalizarlo en cada caso?

Espero la respuesta impacientemente, se trata de una aplicación que estoy desarrollando en el trabajo y me encuentro bastante estancada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Crear un control de usuario

Publicado por Huguin (83 intervenciones) el 20/11/2008 02:25:07
Hola, pues si aun no lo has resuelto creo haber encontrado la solucion.

En la clase personalizada declara eventos publicos

Public Class PictureXX
Public Event Clic_Picture1()
Public Event Clic_Picture2()
Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
'' Add any initialization after the InitializeComponent() call.
End Sub

Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
RaiseEvent Clic_Picture1()
End Sub

Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click
RaiseEvent Clic_Picture2()
End Sub
End Class

luego desde el form solo buscas el evento del control.

Private Sub PictureXX1_Clic_Picture1() Handles PictureXX1.Clic_Picture1
MsgBox("Presionaste el picturebox 1")
End Sub

Private Sub PictureXX1_Clic_Picture2() Handles PictureXX1.Clic_Picture2
Dim x As New Form3
x.Show()
End Sub

te envio a tu correo el ejemplo que desarrolle si te sirve pues bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar