Como criar um controle transparente que funcione sobre outros controles?
Eu tenho um controle (derivado de System.Windows.Forms.Control) que precisa ser transparente em algumas áreas. Eu implementei isso usando SetStyle ():
public TransparentControl()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent.
}
Agora, isso funciona se não houver controles entre o formulário e o controle transparente. No entanto, se houver outro controle abaixo do controle transparente (que é o caso de uso aqui), ele não funcionará. O controle intermediário não é empate, mas o formulário abaixo é exibido. Posso obter o efeito necessário substituindo CreateParams e configurando o balão WS_EX_TRANSPARENT da seguinte maneira:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20; // WS_EX_TRANSPARENT
return cp;
}
}
O problema aqui é que elerealment retarda a pintura do controle. O controle já está em buffer duplo, então nada a fazer lá. O impacto no desempenho é tão ruim que é inaceitável. Alguem mais achou este problema? Todos os recursos que posso encontrar sugerem o uso do método nº 1, mas, novamente, isso não funciona no meu caso.
EDIT: Devo observar que tenho uma solução alternativa. Os controles filho (transparentes) poderiam simplesmente se desenhar no objeto Graphics do pai, mas é realmente feio e não gosto da solução (embora possa ser tudo o que tenho).
EDIT2: Então, seguindo os conselhos que recebi sobre como a transparência funciona no .NET, implementei a interface IContainer no meu controle de usuário, que contém os controles transparentes. Eu criei uma classe que implementa o ISite, adiciono meus controles filho à coleção Components do UserControl, a propriedade Container é alinhada corretamente no depurador, mas ainda não recebo um efeito de transparência. Alguém tem alguma idéia