Pergunta

Existem alguns truques para obter suporte de vidro para formas .Net.

Eu acho que a fonte original para este método é aqui: http://blogs.msdn.com/tims/archive/2006/04/18/578637.aspx

Basicamente:

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

Esse passo final é a questão - qualquer sub controles desenhados sobre essa área parece preto também considerar a máscara de transparência alfa

.

Por exemplo, uma barra de guias sobre a área de classe terá texto transparente.

Existe uma maneira de contornar isso?

Existe uma maneira mais fácil de fazer isso?

Os aplicativos que estou trabalhando tem que trabalhar em ambos XP e Vista - eu preciso deles para degradar graciosamente. Há algum melhores práticas aqui?

Foi útil?

Solução

Não há realmente uma maneira mais fácil de fazer isso. Essas APIs não estão expostos pela .NET Framework (ainda), então a única maneira de fazer isso é através de algum tipo de interoperabilidade (ou WPF).

Quanto a trabalhar com ambas as versões do Windows, o código que você tem deve estar bem, uma vez que o tempo de execução não ir à procura do ponto de entrada para a DLL até que você realmente chamar a função.

Outras dicas

DannySmurf disse ele. Você não tem acesso directo "administrado" a essas APIs que o .NET framework (eu tentei isso mesmo, há algumas semanas).

eu acabei fazendo algo desagradável. Criado minha própria UI com GDI +. (botões, etiquetas arredondadas, etc). Parece o mesmo, independentemente da versão do Windows. Win.Forms é realmente feio, mas isso é tudo que você tem no XP

Eu acho que você esqueceu de definir o TransparencyKey da área que deseja ser de vidro. A partir do artigo,

Em seu aplicativo Windows Forms, você só precisa definir o TransparencyKey propriedade para uma cor que você não vai usar noutro local na aplicação (I uso Gainsboro, por razões que se tornam-se aparentes mais tarde). Então você pode criar um ou mais painéis que são ancorada às margens da sua forma e definir a cor de fundo para o painel para a chave de transparência. Agora, quando você chamada DwmExtendFrameIntoClientArea, o vidro vai mostrar dentro de suas margens onde quer que você definir alguma coisa do chave transparência adequada.

Eu não me importo as chamadas não gerenciados. - É o hack de usar uma caixa preta para imitar o comportamento alfa e o efeito que isso tem então de elemento negro em alguns componentes em cima que é o problema

Uma barata cortar você pode usar é colocar um controle Painel transparente sobre seu formulário e colocar seus controles sobre ele -. Preto, então, ser preto

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top