none
COMO PUEDO CREAR SOMBRA A UN FORMULARIO SIN BORDE

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.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 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.




    viernes, 24 de marzo de 2017 16:13
    Moderador
  • "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.




    viernes, 24 de marzo de 2017 16:36
    Moderador
  • "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.

    viernes, 24 de marzo de 2017 18:22
    Moderador
  • "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.


    viernes, 24 de marzo de 2017 17:02
    Moderador

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

    viernes, 24 de marzo de 2017 1:07
  • Buenos días gracias por contestar Javier Rocco

    cheque tu codigo y me marca error en esta parte

    hWnd



    viernes, 24 de marzo de 2017 15:26
  • Prueba cambiandolo por Me. Handle
    viernes, 24 de marzo de 2017 15:45
  • ya corregi el primer error pero me sale el siguiente  Javier Rocco

    viernes, 24 de marzo de 2017 16:02
  • Dejalo como estaba antes solo cambia lo que te mencione la zona verde dejalo igual como comentario
    viernes, 24 de marzo de 2017 16:06
  • 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

    viernes, 24 de marzo de 2017 16:11
  • "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.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 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.




    viernes, 24 de marzo de 2017 16:13
    Moderador
  • Deberia salir la propiedad Borderstyle =0? o None?
    viernes, 24 de marzo de 2017 16:17
  • Es correcto lo que mencionas Enrique. Ando sin visual studio por ahora. Olvide mencionarle eso.
    viernes, 24 de marzo de 2017 16:24
  • 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


    viernes, 24 de marzo de 2017 16:25
  • 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 


    viernes, 24 de marzo de 2017 16:28
  • 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 

    viernes, 24 de marzo de 2017 16:31
  • Has lo que te indica el Sr. Enrique Montejo. Has las modificaciones como te dice. Para poder solucionar el problema, 

    Saludos

    viernes, 24 de marzo de 2017 16:31
  • 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 

    viernes, 24 de marzo de 2017 16:34
  • "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.




    viernes, 24 de marzo de 2017 16:36
    Moderador
  • aguanten Javier Rocco y Enrique M. Montejo

    creo que ya encontre el problema

     
    viernes, 24 de marzo de 2017 16:36
  • 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.


    viernes, 24 de marzo de 2017 16:50
  • "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.


    viernes, 24 de marzo de 2017 17:02
    Moderador
  • 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

    viernes, 24 de marzo de 2017 17:09
  • Enrique M. Montejo

    qué crees que no me resulto no se a que se deba exactamente ya está probé en un form nuevo sin modificar nada..




    viernes, 24 de marzo de 2017 17:16
  • "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.

    viernes, 24 de marzo de 2017 18:22
    Moderador
  • 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. 




    viernes, 24 de marzo de 2017 18:29
  • 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.. 


    viernes, 24 de marzo de 2017 18:38
  • Bueno al menos el codigo te sirvio de alguna forma con sus modificaciones y ya pudiste resolver tu duda, Imagino que eres mecatronico, Has echo alguna ves  un sistema para inspeccionar tuberias (la corrosion) ?
    viernes, 24 de marzo de 2017 18:45
  • 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..




    viernes, 24 de marzo de 2017 18:56