Autor Tema: Como construir Botones 3D en VB 2008  (Leído 10838 veces)

0 Usuarios y 1 Visitante están viendo este tema.

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Como construir Botones 3D en VB 2008
« en: Julio 31, 2011, 03:12:53 pm »
Saludos a Todos !!! ;D

Este post vendría a ser una continuación (o más bién el resultado o solución o como quieran llamarle :o) del tema tratado "Problemas con las API's".
Como mencioné allá, las API's "son como campos minados" en la programación... sino estás claro en lo que haces con ellas, te explota un error, que jamás en la vida te hubiese imaginado que existía :o.

Tenía problemas con: CreateRoundRectRgn y SetWindowRgn. Dichas funciones sirven para 'redondear' las esquinas de un Form y un PictureBox. Descubrí (no es que haya descubierto la pólvora o el agua tibia, no señor, lo que pasa es que no sabía) experimentando que se podía lograr este ''efecto" directamente en un UserControl y en un CustomControl (parecido al UC, pero que se crea en código, no se puede ver en tiempo de diseño).

¿Por qué de todo esto? porque mi deseo era diseñar un botón 3D para las aplicaciones que diseño. Intenté primero con un PictureBox, no convencían los resultados (visuales, claro está) :P, lo probé con un UC y si resultó satisfactorio ::).
Decidí probar con un CC (CustomControl), pensando, en por lo menos consumir menos recursos, porque como ya mencioné, dicho control se "dibuja" en tiempo de ejecución.
A continuación, coloco una muestra de como pueden verse:



Ahora un ejemplo del botón en sus 3 estados: Normal, Cuando el cursor pasa por encima y al ser "presionado":

  "Normal"

   "Cursor encima"

   "Botón pulsado"

Adicional, estas propiedades pueden ser configuradas también:



Las propiedades ButtonBorderColorHover, ButtonBorderColorNormal y ButtonBorderColorPulsed determinan el color del borde del botón según su estado.
CornerRadius, la curvatura de las esquinas del botón. CornerX y CornerY, conviene dejarlas con valor 0 (de lo contrario se vería 'descuadrado' el botón).
FinalGradientMouseDown, FinalGradientMouseEnter, FinalGradientMouseLeave y FinalGradientPaint, muestran el color final en el efecto de degradado del botón.
FontSize, El tamaño de la fuente del texto.



FontText, Tipo de fuente (aquí, hay que colocar el nombre de la fuente, debido a que no lo coloqué una página de propiedades.
InitialGradientMouseDown, InitialGradientMouseEnter, InitialGradientMouseLeave y InitialGradientMousePaint, muestran el color inicial del degradado del botón.
TextButton, El texto que lleva el botón (ya que éste, es 'dibujado' con el método DrawString)

Con respecto a la presentación visual, no digo que sea una "obra de arte", pero estoy tratando de mejorarla, se aceptan todas las sugerencias y correcciones posibles.

Ah, no se me ha olvidado colocar el código respectivamente, dentro de poco lo subo a 'rapidshare', 'megaupload' o 'fileserve'.


Saludos !!!
Manuel F. Borrego S. 8)
Barcelona, Edo. Anzoátegui. Barcelona.
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Como construir Botones 3D en VB 2008
« Respuesta #1 en: Julio 31, 2011, 08:09:25 pm »
Muy buen aporte :)
Me encuentras en YAcosta.com

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Como construir Botones 3D en VB 2008
« Respuesta #2 en: Agosto 01, 2011, 06:59:37 am »
Muy buenos días !!! ;D ;D ;D

Como lo había prometido, subí el código para construir el botón 3D en VB 2008.
Este es el link de descarga:

(bueno a este mensaje traté editarlo, y se me volvió un desastre !!!, mas abajo coloco la corrección !!!)

Saludos !!! ;D
Manuel F. Borrego S. 8)
Barcelona, Edo. Anzoátegui. Venezuela.
« última modificación: Septiembre 09, 2012, 12:31:11 pm por ADONAIRAFA »
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

_katze_

  • Bytes
  • *
  • Mensajes: 49
  • Reputación: +2/-0
    • Ver Perfil
Re:Como construir Botones 3D en VB 2008
« Respuesta #3 en: Agosto 01, 2011, 09:01:00 pm »
estoy revisando el codigo y la verdad que es otra forma de crear controles...yo hubiece intentando heredando el control antes de dibujarlo y modificaba todas sus propiedades y te quedara igual creo yo ! eseguire viendo y te dire que sucede ! un abrazo

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Como construir Botones 3D en VB 2008
« Respuesta #4 en: Agosto 02, 2011, 12:15:50 pm »
Saludos !!!

_katze_ Descubrí hoy que hay un error en el código (másbien una omisión). Resulta, que si le das cualquier uso al botón, no hay problema... pero imagina que usas el botón para descargar un Form, usando el método Close o Dispose, ahí es cuado se presenta el problema: que trata de dibujar nuevamente el control, cuando éste, ha sido eliminado, y al tratra de establecer la isntancia respectiva, salta la excepción >:( >:( >:(

Pero ya estoy trabajando en resolverlo. En breve, subo el código corregido.

Saludos !!!
Manuel F. Borrego S. 8)
Venezuela.
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

ssccaann43

  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Como construir Botones 3D en VB 2008
« Respuesta #5 en: Agosto 02, 2011, 12:53:53 pm »
Muy buen aporte Ado, saludos...!
Miguel Núñez.

_katze_

  • Bytes
  • *
  • Mensajes: 49
  • Reputación: +2/-0
    • Ver Perfil
Re:Como construir Botones 3D en VB 2008
« Respuesta #6 en: Agosto 03, 2011, 12:06:51 am »
prueba cerrando con Aplication.exit()

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Como construir Botones 3D en VB 2008
« Respuesta #7 en: Agosto 03, 2011, 06:08:38 pm »
Saludos _katze_ ;D

Con ese método, funciona si hablamos de un único Form, pero cuando 2 o más Forms en un MDI (por ejemplo), ahí se presenta la Excepción.

Pero realicé una pequeña modificación al código, que tanto tú como el que quiera servirse de él, puede hacerle sin ningún contratiempo, he aquí lo que menciono:

Agregué una propiedad:

Código: [Seleccionar]
Public Property CloseForm() As Boolean
              Get
                     Return _close
              End Get
              Set(ByVal value As Boolean)
                     _close = value
              End Set
End Property



Si el botón 3D se le va a dar cualquier uso (excepto cerrar un Form), la propiedad CloseForm se coloca False. Si por el contrario, dicho control va a servir para cerrar un Form (me refiero a donde este se encuentr contenido), entonces CloseForm debe llevarse a True.

Ahora, hice otras modificaciones pequeñas:

Código: [Seleccionar]
#Region "Private Vars"
       Private _close As Boolean = False
       '//
       Private _cornerRadius As Integer = 10
       Private _cornerX As Integer = 0
       Private _cornerY As Integer = 0
       Private _fontSize As Integer = 12
       '//
       Private _initialGradientMouseDown As Color = Color.Silver
       Private _initialGradientMouseEnter As Color = Color.White
       Private _initialGradientMouseLeave As Color = Color.White
       Private _initialGradientPaint As Color = Color.White
       Private _finalGradientMouseDown As Color = Color.White
       Private _finalGradientMouseEnter As Color = Color.Silver
       Private _finalGradientMouseLeave As Color = Color.Gray
       Private _finalGradientPaint As Color = Color.Gray
       Private _bBCPenNorm As Color = Color.DimGray
       Private _bBCPenHover As Color = Color.DarkGray
       Private _bBCPenPulsed As Color = Color.Silver
       Private _thicknessPen As Integer = 1
       '//
       Public _textShadowBrush As Brush = Brushes.DimGray
       Public _textPowerBrush As Brush = Brushes.White
       '//
       Private _textButton As String = "Button Text"
       Private _fontText As String = "Arial"
       '//
#End Region

Se añadió la variable _close, del tipo Boolean y de valor predeterminado False.

Se modificó el Evento "MouseUp" del control:

Código: [Seleccionar]
Private Sub mfb3DButton_MouseUp(ByVal sender As Object, _
                                                                  ByVal e As System.Windows.Forms.MouseEventArgs) _
                                                                  Handles Me.MouseUp
              DrawCustomButton(_cornerX, _cornerY, Me, _
                                               _initialGradientMouseLeave, _finalGradientMouseLeave, _
                                               _fontText, _fontSize, _textButton, _
                                               _textShadowBrush, _textPowerBrush, 1, 0, _close)
              '//
              If _close = True Then Exit Sub
              '//
              DrawRoundedRectangle(Me.CreateGraphics, _bBCPenNorm, _thicknessPen, _
                                                       _cornerX, _cornerY, Me.Width - 2, Me.Height - 2, _
                                                       _cornerRadius)
              DrawRoundedRectangle(Me.CreateGraphics, _bBCPenNorm, _thicknessPen, _
                                                       _cornerX + 1, _cornerY + 1, Me.Width - 4, Me.Height - 4, _
                                                       _cornerRadius)
End Sub

Y por último se agregó la Instrucción: If _close = True Then Exit Sub

Código: [Seleccionar]
Private Sub DrawCustomButton(ByVal x As Integer, _
                                                           ByVal y As Integer, _
                                                           ByVal CC As mfbButton3D, _
                                                           ByVal _gradColor1 As Color, _
                                                           ByVal _gradColor2 As Color, _
                                                           ByVal _fontText As String, _
                                                           ByVal _fontSize As Single, _
                                                           ByVal _textString As String, _
                                                           ByVal _textShadowBrush As Brush, _
                                                           ByVal _textPowerBrush As Brush, _
                                                           ByVal shw As Integer, _
                                                           ByVal pwr As Integer, _
                                                           Optional ByVal _close As Boolean = False)
              If _close = True Then Exit Sub
              '//
              Dim _rectangle As New Rectangle(x, y, CC.Width, CC.Height)
              Dim grap As Graphics = CC.CreateGraphics
              '//---------------------------------------------------------------------------------------------------
              Dim gradbr As New LinearGradientBrush(_rectangle, _gradColor1, _gradColor2, _
                                                                                 LinearGradientMode.Vertical)
              grap.FillRectangle(gradbr, _rectangle)
              '//---------------------------------------------------------------------------------------------------
              Dim _graphics As Graphics
              Dim _font As New Font(_fontText, _fontSize, FontStyle.Bold, GraphicsUnit.Pixel)
              _graphics = CC.CreateGraphics
              '//
              Dim TextSize As SizeF
              TextSize = _graphics.MeasureString(_textString, _font)
              '//
              Dim xPos, yPos As Single
              xPos = (CC.Width - TextSize.Width) / 2
              yPos = (CC.Height - TextSize.Height) / 2
              _graphics.DrawString(_textString, _font, _textShadowBrush, xPos + shw, yPos + shw)
              _graphics.DrawString(_textString, _font, _textPowerBrush, xPos + pwr, yPos + pwr)
End Sub

Luego de todo esto, Se acabó el problema de la bendita Exepción, que me aparecía a cada rato.



Saludos y un Abrazo, amigo !!! ;D
Manuel F. Borrego S. 8)
Barcelona, Edo. Anzoátegui, Venezuela.
« última modificación: Agosto 19, 2011, 12:52:07 am por ADONAIRAFA »
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

_katze_

  • Bytes
  • *
  • Mensajes: 49
  • Reputación: +2/-0
    • Ver Perfil
Re:Como construir Botones 3D en VB 2008
« Respuesta #8 en: Agosto 03, 2011, 08:41:13 pm »
si man tienes razon ! es una solucion viable! noc si la unica pero sirve al parecer! gracias por el control!

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Como construir Botones 3D en VB 2008
« Respuesta #9 en: Agosto 03, 2011, 10:00:44 pm »
Si te digo algo viejo ::)... no puedo decir que es la única, pero si te digo que fue la primera que me salió al paso, sin tantos "adornos" y me funcionó, y dejé el asunto así para no buscar más bronca con el código, y listo !!!

Saludos !!!
Manuel F. Borrego S. 8)
Barcelona. Venezuela
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Como construir Botones 3D en VB 2008
« Respuesta #10 en: Agosto 03, 2011, 10:51:48 pm »
Cooo...!!! se me había pasado un "pequeño detalle"...
_katze_, si te fijas (es para todos también), entre las variables declaradas:

Código: [Seleccionar]
'//
Public _textShadowBrush As Brush = Brushes.DimGray
Public _textPowerBrush As Brush = Brushes.White
'//

Dejé como Public las 2 de arriba, con la finalidad de poder configurar el color del texto del botón:
_textShadowBrush - Color de fondo para el texto.
_textPowerBrush    -    "     frontal del texto.

Tuve que hacerlo de esa forma, porque cuando quise crear las propiedades respectivas de tipo Brush al ver la propiedad reflejada en el cuadro Properties,
Éstas, se veian 'sombreadas' y no disponibles. No supe resolver ese inconveniente, y me fui por el camino anteriormente mencionado. Si tienes (o alguien tiene) la solución a ese 'detalle' te lo agradecería.

Saludos !!!
Manuel F. Borrego S. 8)
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Como construir Botones 3D en VB 2008
« Respuesta #11 en: Septiembre 09, 2012, 12:41:24 pm »
Este es la continuación de un mensaje publicado más arriba, el cual se me volvió mierd...  >:( >:( >:( editándolo, mis más sinceras disculpas por esto !!! :-[

Aquí agrego el nuevo link para la descarga del código (si funciona):

http://netload.in/datei5twFR3nLPb/MFB3DCustomButtom.zip.htm

Les recuerdo para aquellos que no conocen a un CustomControl, este no se puede ver en tiempo de diseño (solo puede observarse el código), el mismo se dibuja en tiempo de ejecución.


Manuel F. Borrego S. 8)
Barcelona - Venezuela.

PD: Para instalarlo en VB 2008 (en mi caso), agreguénlo
       primeramente en las referencia, y automáticamente
       se colocará en el ToolBox.
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

lbmex

  • Bit
  • Mensajes: 1
  • Reputación: +0/-0
    • Ver Perfil
Re:Como construir Botones 3D en VB 2008
« Respuesta #12 en: Abril 28, 2015, 04:03:58 pm »
Buen dia, siento reabrir este tema de discusión pero serias tan amable de publicar nuevamente el archivo para poder descargarlo o si alguien que lo haya bajado seria tan amable de compartirlo se lo agradecere. Saludos