Visual Basic Foro
Programación => Visual Basic .NET / C# => Mensaje iniciado por: ADONAIRAFA 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:
(http://img40.imageshack.us/img40/6863/b3d01.jpg)
Ahora un ejemplo del botón en sus 3 estados: Normal, Cuando el cursor pasa por encima y al ser "presionado":
(http://img706.imageshack.us/img706/2150/b3d05normal.jpg) "Normal"
(http://img825.imageshack.us/img825/5092/b3d06cursorhover.jpg) "Cursor encima"
(http://img801.imageshack.us/img801/8620/b3d07pulsado.jpg) "Botón pulsado"
Adicional, estas propiedades pueden ser configuradas también:
(http://img23.imageshack.us/img23/9672/b3d02.jpg)
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.
(http://img843.imageshack.us/img843/1185/b3d03.jpg)
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.
-
Muy buen aporte :)
-
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.
-
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
-
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.
-
Muy buen aporte Ado, saludos...!
-
prueba cerrando con Aplication.exit()
-
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:
Public Property CloseForm() As Boolean
Get
Return _close
End Get
Set(ByVal value As Boolean)
_close = value
End Set
End Property
(http://img33.imageshack.us/img33/862/b3d09propiedadadicional.jpg)
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:
#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:
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
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.
-
si man tienes razon ! es una solucion viable! noc si la unica pero sirve al parecer! gracias por el control!
-
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
-
Cooo...!!! se me había pasado un "pequeño detalle"...
_katze_, si te fijas (es para todos también), entre las variables declaradas:
'//
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)
-
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 (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.
-
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