Pregunta

Hay un par de trucos para conseguir soporte de Glass para formularios .Net.

Creo que la fuente original de este método está aquí: http://blogs.msdn.com/tims/archive/2006/04/18/578637.aspx

Básicamente:

//reference Desktop Windows Manager (DWM API)
[DllImport( "dwmapi.dll" )]
static extern void DwmIsCompositionEnabled( ref bool pfEnabled );

[DllImport( "dwmapi.dll" )]
static extern int DwmExtendFrameIntoClientArea( IntPtr hWnd, ref MARGINS pMarInset );


//then on form load
//check for Vista
if ( Environment.OSVersion.Version.Major >= 6 )
{
    //check for support
    bool isGlassSupported = false;
    DwmIsCompositionEnabled( ref isGlassSupported );

    if ( isGlassSupported )
        DwmExtendFrameIntoClientArea( this.Handle, ref margins );
...

//finally on print draw a black box over the alpha-ed area
//Before SP1 you could also use a black form background

El problema es ese paso final: cualquier subcontrol dibujado sobre esa área también parece tratar el negro como la máscara de transparencia alfa.

Por ejemplo, una pestaña sobre el área de clase tendrá texto transparente.

¿Hay alguna forma de evitar esto?

¿Hay alguna forma más fácil de hacer esto?

Las aplicaciones en las que estoy trabajando tienen que funcionar tanto en XP como en Vista; necesito que se degraden correctamente.¿Existen mejores prácticas aquí?

¿Fue útil?

Solución

Realmente no existe una manera más fácil de hacer esto.Estas API no están expuestas en .NET Framework (todavía), por lo que la única forma de hacerlo es a través de algún tipo de interoperabilidad (o WPF).

En cuanto a trabajar con ambas versiones de Windows, el código que tiene debería estar bien, ya que el tiempo de ejecución no busca el punto de entrada a la DLL hasta que usted llama a la función.

Otros consejos

DannyPitufo lo dijo.No tiene acceso directo "administrado" a estas API a través del marco .NET (lo probé yo mismo hace unas semanas).

Terminé haciendo algo desagradable.Creé mi propia interfaz de usuario con GDI+.(Botones, etiquetas redondeadas, etc).Tiene el mismo aspecto independientemente de la versión de Windows.Win.Forms es realmente feo, pero eso es todo lo que tienes en el lado de XP <.

Creo que olvidaste configurar la clave de transparencia del área que quieres que sea vidrio.Del artículo,

En su aplicación de formularios de Windows, simplemente necesita establecer la propiedad TransParencyKey en un color que no usará en otro lugar de la aplicación (uso Gainsboro, por razones que se harán evidentes más adelante).Luego, puede crear uno o más paneles que se acoplen a los márgenes de su forma y establezcan el color de fondo para el panel a la tecla de transparencia.Ahora, cuando llame a DWMEXTENDFRameInToclientAea, el vidrio se mostrará dentro de sus márgenes donde sea que haya establecido algo de la clave de transparencia adecuada.

No me importan las llamadas no administradas: el problema es el truco de usar una caja negra para imitar el comportamiento alfa y el efecto que luego tiene sobre el elemento negro en algunos componentes superiores.

Un truco económico que puede utilizar es colocar un control de Panel transparente sobre su formulario y colocar sus controles en él; el negro será entonces negro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top