Estoy tratando de tener Aero Glass mirada en mis formas, en VB.NET 2010 app con DWM API, pero como llamada de función indica, se extiende la mirada de Marco para el área de cliente, y si el formulario no tiene fronteras, no pasará nada y el formulario se convierten en invisibles. Así que, ¿puedo obtener Aero glass en un formulario sin ningún tipo de frontera…. ??

OriginalEl autor Kushal | 2010-12-12

1 Comentario

  1. 12

    Como usted ha dicho, DwmExtendFrameIntoClientArea, literalmente, se extiende el efecto de cristal transparente de la ventana del marco en su área de cliente, lo que significa que si tu formulario FormBorderStyle está ajustado a “None”, la ventana efectivamente va a ser invisible.

    En su lugar, debe utilizar el DwmEnableBlurBehindWindow API, que permite la vidriosa efecto de desenfoque en una ventana sin necesidad de tener un marco o borde. Toma dos parámetros. La primera (hWnd) es el identificador de la forma que usted desea aplicar el desenfoque detrás de efecto. El segundo (pBlurBehind) es una estructura que se pasa por referencia que contiene los datos o parámetros para el efecto.

    Por lo tanto, usted también tiene que definir el DWM_BLURBEHIND estructura, que en sí mismo contiene cuatro miembros. La primera (dwFlags) es un bit a bit combinación de valores constantes que indican que los miembros de esta estructura se han establecido. El segundo (fEnable) indica si desea activar o desactivar el efecto de desenfoque. La tercera (hRgnBlur) le permite especificar una región en particular dentro del área de cliente de que el efecto de desenfoque será aplicada; esta configuración Nothing indica que el área de cliente completo tendrá el efecto de desenfoque. El cuarto (fTransitionOnMaximized) le permite especificar si es o no la forma de la coloración debe de transición para que coincida con las ventanas maximizadas.

    Aquí está el final de la API de las declaraciones que usted tenga que incluir en el código para utilizar esta función:

    <StructLayout(LayoutKind.Sequential)> _
    Private Structure DWM_BLURBEHIND
        Public dwFlags As Integer
        Public fEnable As Boolean
        Public hRgnBlur As IntPtr
        Public fTransitionOnMaximized As Boolean
    End Structure
    
    Private Const DWM_BB_ENABLE As Integer = &H1
    Private Const DWM_BB_BLURREGION As Integer = &H2
    Private Const DWM_BB_TRANSITIONONMAXIMIZED As Integer = &H4
    
    <DllImport("dwmapi.dll", PreserveSig:=False)> _
    Private Shared Sub DwmEnableBlurBehindWindow(ByVal hWnd As IntPtr, ByRef pBlurBehind As DWM_BLURBEHIND)
    End Sub

    Y, a continuación, he aquí un ejemplo simple de cómo habría que llamar a esta función en una forma particular:

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)
    
        ''#Set the form's border style to None
        Me.FormBorderStyle = FormBorderStyle.None
    
        ''#Whatever region that you fill with black will become the glassy region
        ''# (in this example, the entire form becomes transparent)
        Me.BackColor = Color.Black
    
        ''#Create and populate the blur-behind structure
        Dim bb As DWM_BLURBEHIND
        bb.dwFlags = DWM_BB_ENABLE
        bb.fEnable = True
        bb.hRgnBlur = Nothing
    
        ''#Enable the blur-behind effect
        DwmEnableBlurBehindWindow(Me.Handle, bb)
    End Sub

    Si, por el contrario, sólo desea aplicar el desenfoque detrás de un efecto particular de la subregión del formulario, será necesario suministrar una válida de la región para la hRgnBlur miembro, y agregar el DWM_BB_BLURREGION la bandera a la dwFlags miembro.

    Puede utilizar el Región.GetHrgn método para obtener un identificador de la región en la que desea especificar como la hRgnBlur miembro. Por ejemplo, en lugar del código anterior, puede utilizar el siguiente:

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)
    
        ''#Set the form's border style to None
        Me.FormBorderStyle = FormBorderStyle.None
    
        ''#Fill the entire form with black to make it appear transparent
        Me.BackColor = Color.Black
    
        ''#Create a region corresponding to the area of the form you want to render as glass
        Using g As Graphics = Me.CreateGraphics
            Dim glassRect As New Rectangle(0, 0, 100, 150)
            Using rgn As New Region(glassRect)
                ''#Create and populate the blur-behind structure
                Dim bb As DWM_BLURBEHIND
                bb.dwFlags = DWM_BB_ENABLE Or DWM_BB_BLURREGION
                bb.fEnable = True
                bb.hRgnBlur = rgn.GetHrgn(g)
    
                ''#Enable blur-behind effect
                DwmEnableBlurBehindWindow(Me.Handle, bb)
            End Using
        End Using
    End Sub

    Observe cómo, incluso cuando se especifica una determinada subregión para aplicar el desenfoque detrás de efecto, todavía se establezca el formulario en su totalidad el color de fondo a negro? Esto hará que la región en que se especifica a prestar, con un carácter de desenfoque-detrás de efecto, y el resto de forma transparente. Por supuesto, usted puede configurar el resto de la forma del color de fondo a cualquier color que desee (aunque asegúrese de llenar el rectángulo que desea que aparezca como el cristal con el color negro, como antes), pero aparecerá como parcialmente transparente, sólo que sin la chicharrita de desenfoque-detrás de efecto. MSDN explica por qué este es el caso de:

    Cuando se aplica el desenfoque detrás de efecto
    para una subregión de la ventana, la
    canal alfa de la ventana se utiliza
    para el nonblurred área. Esto puede
    provocar un inesperado transparencia en
    el nonblurred región de una ventana.
    Por lo tanto, tener cuidado al aplicar una
    efecto de desenfoque a una subregión.

    Tan lejos como estoy de que se trate, que hace que la aplicación de este efecto únicamente a una subregión de la ventana del formulario relativamente inútil. La única vez que me parece que tendría sentido es que si quieres dar una arbitraria no es rectangular como vidriosos, con el resto de la forma restantes transparente.

    +1, pero inservible a menos que se le muestran cómo utilizar la región.
    He añadido un ejemplo de las regiones, aunque como digo, la utilidad de este me parece muy limitado, al menos en WinForms.
    Gracias por tomarse el tiempo y dar una breve explicación, funcionó como usted sugiere. Donde puedo encontrar los detalles acerca de otros métodos de esta API, aparte de MSDN??
    Otro de MSDN, realmente no estoy seguro. Usted podría tratar de pinvoke.net, pero he encontrado su cobertura de tipo de manchas, y es mejor para cotejar su contenido con lo que se encuentra en MSDN porque algunas declaraciones son incorrectos o incompletos. Microsoft desgraciadamente, no ha hecho tomar una ventaja completa de DWM características muy conveniente para nosotros .NETO de los desarrolladores. Una vez que sepa la función que desea importar, una búsqueda en Google va a menudo a su vez, algunas entradas en el blog (muchos de ellos de MS empleados), pero me temo que no sé de ningún recurso central.
    Tengo, Granizo Google… 🙂

    OriginalEl autor Cody Gray

Dejar respuesta

Please enter your comment!
Please enter your name here