Principales respuestas
COMO PUEDO CREAR SOMBRA A UN FORMULARIO SIN BORDE

Pregunta
-
Hola buen dia mi pregunta es como puedo colocarle sombra a un formulario sin borde, cual seria de codigo de antemano muchas gracias y un gran saludo :)
- Editado Christian Medellin jueves, 23 de marzo de 2017 22:49
Respuestas
-
"Christian Medellin" escribió:
> ya corregi el primer error pero me sale el siguiente
Hola, Christian:
El problema con los errores que estás teniendo se debe a que te has limitado a copiar en tu formulario el código que el usuario Javier Rocco te ha indicado, tal cual lo ha publicado, sin advertir que ese código está escrito en Visual Basic clásico, por lo que tendrás que adaptarlo a Visual Basic .NET, incluidos los tipos de dato de los valores de los parámetros de las distintas declaraciones de funciones API que se utilizan.
Prueba a ejecutar dicho código como indico a continuación:
Public Class Form1 Private m_hOriginalParent As Integer Private Const GWL_HWNDPARENT As Integer = -8 Private Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (lngHandler As IntPtr, lngIndex As Integer) As Integer Private Declare Function GetDesktopWindow Lib "user32" () As Integer Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (lngHandler As IntPtr, lngIndex As Integer, lngNewClassLong As Integer) As Integer Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (hWnd As IntPtr, nIndex As Integer, dwNewLong As Integer) As Integer Public Sub New() ' Esta llamada es exigida por el diseñador. InitializeComponent()
' Agregue cualquier inicialización después de la llamada a InitializeComponent().
'
Me.SuspendLayout()' NO EJECUTAR LO SIGUIENTE EN EL EVENTO LOAD DEL FORMULARIO
Me.FormBorderStyle = FormBorderStyle.NoneConst CS_DROPSHADOW As Integer = &H20000
Const GCL_STYLE As Integer = -26m_hOriginalParent = SetWindowLong(Me.Handle, GWL_HWNDPARENT, GetDesktopWindow())
SetClassLong(Me.Handle, GCL_STYLE, GetClassLong(Me.Handle, GCL_STYLE) Or CS_DROPSHADOW)Me.ResumeLayout(False)
End Sub Private Sub Form1_Closed(sender As Object, e As EventArgs) Handles Me.Closed SetWindowLong(Me.Handle, GWL_HWNDPARENT, m_hOriginalParent) End Sub End Class
Un saludo
Enrique Martínez Montejo
[MS MVP - Visual Studio y Tecnologías de Desarrollo]
Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.
- Editado Enrique M. MontejoModerator viernes, 24 de marzo de 2017 16:24
- Propuesto como respuesta Javier Roque viernes, 24 de marzo de 2017 16:29
- Marcado como respuesta Christian Medellin viernes, 24 de marzo de 2017 18:37
-
"Christian Medellin" escribió:
> pero no se visualiza ningún sombreado
Si posamos el formulario sobre un fondo blanco, se podrá apreciar mejor el sombreado, tal y como muestra la siguiente captura:
Y el mismo formulario SIN SOMBRA sería el siguiente:
¿Observas la diferencia entre uno y otro?
Se comprende que el formulario no tiene borde:
Me.FormBorderStyle = FormBorderStyle.None
Te comento que acabo de editar mi respuesta anterior, para que todo el código que se ejecuta en el evento Load se ejecute en el constructor del formulario:
Public Sub New() ' Esta llamada es exigida por el diseñador. InitializeComponent() ' Agregue cualquier inicialización después de la llamada a InitializeComponent(). ' Me.SuspendLayout() ' NO EJECUTAR LO SIGUIENTE EN EL EVENTO LOAD DEL FORMULARIO Me.FormBorderStyle = FormBorderStyle.None Const CS_DROPSHADOW As Integer = &H20000 Const GCL_STYLE As Integer = -26 m_hOriginalParent = SetWindowLong(Me.Handle, GWL_HWNDPARENT, GetDesktopWindow()) SetClassLong(Me.Handle, GCL_STYLE, GetClassLong(Me.Handle, GCL_STYLE) Or CS_DROPSHADOW) Me.ResumeLayout(False) End Sub
Enrique Martínez Montejo
[MS MVP - Visual Studio y Tecnologías de Desarrollo]
Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.
- Editado Enrique M. MontejoModerator viernes, 24 de marzo de 2017 16:38
- Marcado como respuesta Christian Medellin viernes, 24 de marzo de 2017 18:37
-
"Christian Medellin" escribió:
> lo estoy ejecutando en windows 7 ... crees que sea por eso?
Pues sí puede ser por eso, porque lo acabo de probar en Windows 7 y efectivamente no aparece la sombra, se trate de un formulario con o sin borde. Ignoro en estos momentos si se puede deber a los efectos visuales de Windows Aero.
Enrique Martínez Montejo
[MS MVP - Visual Studio y Tecnologías de Desarrollo]
Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.- Marcado como respuesta Christian Medellin viernes, 24 de marzo de 2017 18:36
-
"Christian Medellin" escribió:
> ... visualizo el formulario en una parte blanca pero no me da ningun sombreado ...
Pues siento mucho que no puedas ver el sombreado porque yo no puedo decir lo mismo, y me remito a las imágenes que aparecen en mi respuesta anterior. ¿?
Haz una prueba sobre un formulario normal y corriente (con borde) para ver si puedes ver el sombreado:
¿Sobre qué sistema operativo estás ejecutando el código? Yo lo estoy ejecutando sobre Windows 10.
Enrique Martínez Montejo
[MS MVP - Visual Studio y Tecnologías de Desarrollo]
Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.- Editado Enrique M. MontejoModerator viernes, 24 de marzo de 2017 17:03
- Marcado como respuesta Christian Medellin viernes, 24 de marzo de 2017 18:37
Todas las respuestas
-
Prueba esto:
Option Explicit Private m_hOriginalParent As Long Private Const GWL_HWNDPARENT As Long = (-8) Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Const CS_DROPSHADOW As Long = &H20000 Private Const GCL_STYLE As Long = -26 Private Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal lngHandler As Long, ByVal lngIndex As Long) As Long Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal lngHandler As Long, ByVal lngIndex As Long, ByVal lngNewClassLong As Long) As Long Private Declare Function GetDesktopWindow Lib "user32" () As Long 'Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long 'Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Sub Form_Load() 'Dim mRGN As Long 'mRGN = CreateEllipticRgn(0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY) 'SetWindowRgn Me.hWnd, mRGN, True m_hOriginalParent = SetWindowLong(hWnd, GWL_HWNDPARENT, GetDesktopWindow()) Call SetClassLong(hWnd, GCL_STYLE, GetClassLong(Me.hWnd, GCL_STYLE) Or CS_DROPSHADOW) End Sub Private Sub Form_Unload(Cancel As Integer) Call SetWindowLong(hWnd, GWL_HWNDPARENT, m_hOriginalParent) End Sub
Saludos
-
- Editado Christian Medellin viernes, 24 de marzo de 2017 15:34
-
-
ya corregi el primer error pero me sale el siguiente Javier Rocco
-
-
listo Javier Rocco
aaa ok perfecto ya no me sale ningun error y lo corro normal pero no me visualiza la sombra como si no hubiera puesto ningun codigo o como puedo activarlo?
sorry por tanta molestia no se mucho sobre esto y estoy aprendiendo..
pero gracias por contestar
-
"Christian Medellin" escribió:
> ya corregi el primer error pero me sale el siguiente
Hola, Christian:
El problema con los errores que estás teniendo se debe a que te has limitado a copiar en tu formulario el código que el usuario Javier Rocco te ha indicado, tal cual lo ha publicado, sin advertir que ese código está escrito en Visual Basic clásico, por lo que tendrás que adaptarlo a Visual Basic .NET, incluidos los tipos de dato de los valores de los parámetros de las distintas declaraciones de funciones API que se utilizan.
Prueba a ejecutar dicho código como indico a continuación:
Public Class Form1 Private m_hOriginalParent As Integer Private Const GWL_HWNDPARENT As Integer = -8 Private Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (lngHandler As IntPtr, lngIndex As Integer) As Integer Private Declare Function GetDesktopWindow Lib "user32" () As Integer Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (lngHandler As IntPtr, lngIndex As Integer, lngNewClassLong As Integer) As Integer Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (hWnd As IntPtr, nIndex As Integer, dwNewLong As Integer) As Integer Public Sub New() ' Esta llamada es exigida por el diseñador. InitializeComponent()
' Agregue cualquier inicialización después de la llamada a InitializeComponent().
'
Me.SuspendLayout()' NO EJECUTAR LO SIGUIENTE EN EL EVENTO LOAD DEL FORMULARIO
Me.FormBorderStyle = FormBorderStyle.NoneConst CS_DROPSHADOW As Integer = &H20000
Const GCL_STYLE As Integer = -26m_hOriginalParent = SetWindowLong(Me.Handle, GWL_HWNDPARENT, GetDesktopWindow())
SetClassLong(Me.Handle, GCL_STYLE, GetClassLong(Me.Handle, GCL_STYLE) Or CS_DROPSHADOW)Me.ResumeLayout(False)
End Sub Private Sub Form1_Closed(sender As Object, e As EventArgs) Handles Me.Closed SetWindowLong(Me.Handle, GWL_HWNDPARENT, m_hOriginalParent) End Sub End Class
Un saludo
Enrique Martínez Montejo
[MS MVP - Visual Studio y Tecnologías de Desarrollo]
Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.
- Editado Enrique M. MontejoModerator viernes, 24 de marzo de 2017 16:24
- Propuesto como respuesta Javier Roque viernes, 24 de marzo de 2017 16:29
- Marcado como respuesta Christian Medellin viernes, 24 de marzo de 2017 18:37
-
-
-
hola Enrique M. Montejo
mas que nada gracias por contestar el codigo que me brindaste lo puse como me dijiste, aquí se muestra una imagen
pero no se visualiza ningún sombreado
- Editado Christian Medellin viernes, 24 de marzo de 2017 16:29
-
gracias nuevamente por contestar Javier Rocco
a continuación te mostrare un a imagen en donde se ve el codigo que me indicaste que pusiera, pero no me da ningún sombreado
- Editado Christian Medellin viernes, 24 de marzo de 2017 16:30
-
aaa ok muchas gracias por indicarlo Javier Rocco
y no te preocupes tenemos muchas cosas en la cabeza que es normal que se nos olviden
-
-
de hecho ya lo hice Javier Rocco
tal cual me indico pero no me da ningún sombreado de hecho hasta subi una imagen de cómo coloque el código
-
"Christian Medellin" escribió:
> pero no se visualiza ningún sombreado
Si posamos el formulario sobre un fondo blanco, se podrá apreciar mejor el sombreado, tal y como muestra la siguiente captura:
Y el mismo formulario SIN SOMBRA sería el siguiente:
¿Observas la diferencia entre uno y otro?
Se comprende que el formulario no tiene borde:
Me.FormBorderStyle = FormBorderStyle.None
Te comento que acabo de editar mi respuesta anterior, para que todo el código que se ejecuta en el evento Load se ejecute en el constructor del formulario:
Public Sub New() ' Esta llamada es exigida por el diseñador. InitializeComponent() ' Agregue cualquier inicialización después de la llamada a InitializeComponent(). ' Me.SuspendLayout() ' NO EJECUTAR LO SIGUIENTE EN EL EVENTO LOAD DEL FORMULARIO Me.FormBorderStyle = FormBorderStyle.None Const CS_DROPSHADOW As Integer = &H20000 Const GCL_STYLE As Integer = -26 m_hOriginalParent = SetWindowLong(Me.Handle, GWL_HWNDPARENT, GetDesktopWindow()) SetClassLong(Me.Handle, GCL_STYLE, GetClassLong(Me.Handle, GCL_STYLE) Or CS_DROPSHADOW) Me.ResumeLayout(False) End Sub
Enrique Martínez Montejo
[MS MVP - Visual Studio y Tecnologías de Desarrollo]
Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.
- Editado Enrique M. MontejoModerator viernes, 24 de marzo de 2017 16:38
- Marcado como respuesta Christian Medellin viernes, 24 de marzo de 2017 18:37
-
aguanten Javier Rocco y Enrique M. Montejo
creo que ya encontre el problema
-
ya corregi el error que tenia Enrique M. Montejo
lo que había hecho es colocar parte del código de "NEW" en ""LOAD" y ademas de ello corregi el código nuevo que me indicaste, así que tomé dos fotos una de como me quedo el código modificado y la otra de como visualizo el formulario en una parte blanca pero no me da ningun sombreado las imágenes son las siguientes.
- Editado Christian Medellin viernes, 24 de marzo de 2017 16:53
-
"Christian Medellin" escribió:
> ... visualizo el formulario en una parte blanca pero no me da ningun sombreado ...
Pues siento mucho que no puedas ver el sombreado porque yo no puedo decir lo mismo, y me remito a las imágenes que aparecen en mi respuesta anterior. ¿?
Haz una prueba sobre un formulario normal y corriente (con borde) para ver si puedes ver el sombreado:
¿Sobre qué sistema operativo estás ejecutando el código? Yo lo estoy ejecutando sobre Windows 10.
Enrique Martínez Montejo
[MS MVP - Visual Studio y Tecnologías de Desarrollo]
Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.- Editado Enrique M. MontejoModerator viernes, 24 de marzo de 2017 17:03
- Marcado como respuesta Christian Medellin viernes, 24 de marzo de 2017 18:37
-
Enrique M. Montejo lo estoy ejecutando en windows 7 ahora si que mi maquina no soporta windows 10 crees que sea por eso?
y deja realizó la prueba que me indicas
-
- Editado Christian Medellin viernes, 24 de marzo de 2017 17:21
-
"Christian Medellin" escribió:
> lo estoy ejecutando en windows 7 ... crees que sea por eso?
Pues sí puede ser por eso, porque lo acabo de probar en Windows 7 y efectivamente no aparece la sombra, se trate de un formulario con o sin borde. Ignoro en estos momentos si se puede deber a los efectos visuales de Windows Aero.
Enrique Martínez Montejo
[MS MVP - Visual Studio y Tecnologías de Desarrollo]
Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.- Marcado como respuesta Christian Medellin viernes, 24 de marzo de 2017 18:36
-
Me imagine cuando me preguntaste por el tipo sistema pero lo alentador es que se que funciona en windows 10
de todas formas muchas gracias por tu tiempo y por la informacion que me has brindado.
- Editado Christian Medellin viernes, 24 de marzo de 2017 18:36
- Editado Enrique M. MontejoModerator viernes, 24 de marzo de 2017 19:04 Eliminar del mensaje la imagen del Moderador.
-
De hecho mi maquina si corre el windows 10 pero no es compatible para instalarlo en modo seguro "Uefi" aparte sus drivers ya no salieron para windows 10 sólo hasta windows 7 profesional que es el actual sistema que tengo, y por ende lo tome como incompatible, puesto que sin drivers y sin modo seguro "Uefi" mi computadora pareciera que tuviera 520 de ram y un procesador muy obsoleto..
- Editado Christian Medellin viernes, 24 de marzo de 2017 18:38
-
-
Javier Rocco y Enrique M. Montejo
Si de echo si me sirvio y les agradesco a los dos de verdad, mas que nada por tomar su tiempo en contestar y resolverme la duda..
y sobre lo otro estudié informática administrativa, diseño gráfico, y sistemas computacionales, pero casi todo lo he aprendido por internet, puesto que en la escuela solo te enseñan lo superficial o almenos a mi me paso y sobre programación me he alimentado de información gracias a ustedes, a demás de lo que ya se, pero la verdad no he intentado hacer un programa para tuberías..
- Editado Christian Medellin viernes, 24 de marzo de 2017 18:57
-
Hola, estoy haciendo una aplicación para escritorio, pero quiero saber como puedo hacer las mismas sombras que tienen las ventanas de Windows (al rededor de toda la ventana) no unicamente abajo y a la derecha (como aparece en este ejemplo) pues mi aplicación es de diseño totalmente blanco en el fondo y sobre puesta en algún fondo blanco se pierde totalmente... quisiera saber como hacer las sombras en los cuatro bordes