Blog meio largado às traças.
Ao menos é isso que deve parecer pra quem olha, mas não é isso não. Só não andava sabendo o que postar, ou como postar. E também andei meio empenhado por aqui aí acabei deixando o blog de lado um pouco, mas resolvi postar aqui uma coisa que considero interessante.
Quem já lidou na plataforma .Net e precisou fazer alguma coisa de interface um pouco complexa, já deve ter se deparado com o mesmo problema. A plataforma não suporta transparência, pelo menos não uma transparência de fato.
Se tu, por exemplo, selecionares um controle qualquer e mudares a propriedade BackColor para Color.Transparent o que ele faz na verdade é pintar o background do controle da mesma cor do background do container em que o controle se encontra, ou (o que efetivamente acontece) da mesma cor do que estiver selecionado como Parent.
Explicação rápida: Parent é uma propriedade do tipo Control, que armazena um controle que é "superior" em relação ao controle com o qual se está trabalhando. Ao menos é esse meu entendimento, a partir do que eu vi até hoje em relação a essa propriedade. Ela é bem comum em controles dentro de containers (Nota: container também é um controle), onde o container, geralmente, é o Parent dos controles dentro dele. Os controles dentro do container são chamados de Childs.
Voltando ao assunto, se tu pegares um controle que tem um canto arredondado, por exemplo, e colocá-lo por cima de outro controle, perceberás que o canto está pintado da cor do background do container, o que não é efetivamente transparente.
Isso não será um problema, se teus controles forem estáticos e não forem se sobrepor.
Mas e se eles forem?
Bom, a boa notícia é que há uma solução, a ruim é que, dependendo do que tu fores desenvolver tu podes não gostar muito do resultado, ou achar apenas razoável. É o meu caso, achei razoável.
Agora por partes.
Pesquisando na internet por transparência é possível encontrar coisas que não funcionam, como é o caso da Color.Transparent, ou coisas que não estão relacionadas com esse assunto, mas sim com uma transparência em relação às outras coisas na tela do computador, como a propriedade TransparencyKey. Usando essa propriedade, você pode escolher uma cor que fique completamente transparente no software, mostrando o que estiver atrás dele na tela do seu computador. Mas isso também não é o que eu quero.
Aí vem a questão. Dependendo do tipo de aplicação que tu estiveres desenvolvendo tu precisas de mais ou menos recursos. Por exemplo, tu simplesmente tens um controle com cantos arredondados, que está por cima de uma imagem e tu precisas que os cantos dele fiquem transparentes pra imagem aparecer corretamente. Ou tu estás criando controles que precisam se movimentar e são mais dinâmicos.
No meu caso, por exemplo, meus controles são espécies de quebra-cabeças, eles precisam se encaixar, e para isso há partes deles que precisarão ficar transparentes.
Basicamente, a implementação da transparência é uma só, mas se eles serão dinâmicos (o usuário poderá movimentá-los) há mais algumas coisas para prestar atenção além da implementação da transparência.
Primeiro uma explicação escrita, depois o código de fato.