Título: Bitmap com cor Transparente
Linguagem: C/C++
S.O.: Windows 3.1 / 95 / NT
Autor(es): Wenderson Teixeira
Muitos me perguntam como desenhar um bitmap na tela, que possua uma cor transparente, de forma que o fundo não seja totalmente sobrescrito pelo desenho, pois bem, é mais simples do que vocês possam imaginar.
Em primeiro lugar eu vou assumir que você já tenha algum conhecimento de GDI, por isso não entrarei em detalhes explicando DCs, operações ROP2, ou muito menos a função BitBlt
.
Para começar você precisa de três de bitmaps, o primeiro é um fundo qualquer, um outro contendo a imagem que você deseja mostrar e o último contendo uma máscara em preto e branco da imagem, onde branco é o que você deseja que apareça e preto é a parte transparente, vamos utilizar as seguintes figuras, feitas pelo grande mestre da arte, ninguém menos do que "eu" mesmo.
Figura 1. O Fundo |
|
Figura 2. A Imagem |
Figura 3. A Máscara |
Basicamente o que se deve fazer, é desenhar o fundo no DC normalmente (SRCCOPY), desenhar a máscara sobre o fundo utilizando a operação OR (SRCPAINT) e por fim, desenhar a imagem sobre a máscara utilizando-se a operação AND (SRCAND), se você quiser inverter a máscara, ou seja, utilizar branco no lugar de preto e vice-versa, basta usar MERGEPAINT no lugar de SRCPAINT ao desenhá-la.
// Cria um DC compatível, p/ conter os bitmaps, seleciona o bitmap // de fundo no DC e salva o bitmap antigo HDC hDC = CreateCompatibleDC(hDCDest); HBITMAP hOldBmp = SelectObject(hDC, hBackground); // Desenha o bitmap de fundo BitBlt(hDCDest, 0, 0, 200, 200, hDC, 0, 0, SRCCOPY); // Seleciona o bitmap de máscara no DC e o desenha utilizando OR SelectObject(hDC, hBitmapMask); BitBlt(hDCDest, 0, 0, 100, 100, hDC, 0, 0, SRCPAINT); //Seleciona o bitmap e o desenha utilizando AND SelectObject(hDC, hBitmap); BitBlt(hDCDest, 0, 0, 100, 100, hDC, 0, 0, SRCAND); // Seleciona de volta o bitmap antigo e apaga o DC SelectObject(hDC, hOldBmp); DeleteDC(hDC);Existem outras diversas formas, porém a maioria depende de outros fatores, essa forma apresentada funciona tanto no Windows 3.x, quanto no 95/98 e NT, além de ser extramamente fácil de se entender.