Necesito crear un control personalizado para mostrar imágenes bmp con canal alfa. El fondo se puede pintar en diferentes colores y las imágenes tienen sombras, así que necesito "pintar" realmente el canal alfa.Cómo dibujar mapas de bits de canal alfa de 32 bits?
¿Alguien sabe cómo hacerlo?
También quiero, si es posible, crear una máscara utilizando la información del canal alfa para saber si el mouse ha hecho clic en la imagen o en el área transparente.
¡Cualquier tipo de ayuda será apreciada!
Gracias.
Editado (JDePedro): Como algunos de ustedes han sugerido, he intentado usar la mezcla alfa para pintar el mapa de bits con el canal alfa. Esto sólo una prueba he implementado en el que se carga un mapa de bits de 32 bits de recursos y trato de pintar usando la función AlphaBlend:
void CAlphaDlg::OnPaint()
{
CClientDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP);
BITMAP BitMap;
bitmap.GetBitmap(&BitMap);
int nWidth = BitMap.bmWidth;
int nHeight = BitMap.bmHeight;
CBitmap *pOldBitmap = dcMem.SelectObject(&bitmap);
BLENDFUNCTION m_bf;
m_bf.BlendOp = AC_SRC_OVER;
m_bf.BlendFlags = 0;
m_bf.SourceConstantAlpha = 255;
m_bf.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(dc.GetSafeHdc(), 100, 100, nWidth, nHeight, dcMem.GetSafeHdc(), 0, 0,nWidth, nHeight,m_bf);
dcMem.SelectObject(pOldBitmap);
CDialog::OnPaint();
}
Esto es sólo una prueba de lo que poner el código en el OnPaint de la diálogo (también probé la función AlphaBlend del objeto CDC).
Las áreas no transparentes se están pintando correctamente, pero me pongo blanco donde el mapa de bits debe ser transparente.
¿Alguna ayuda?
Ésta es una screenshot..it no es fácil de ver, pero hay un rectángulo blanco alrededor del círculo azul: alt text http://img385.imageshack.us/img385/7965/alphamh8.png
Ok. ¡Entiendo! Tengo que multiplicar previamente cada píxel por el valor alfa. Alguien puede sugerir la forma optimizada para hacer eso?
Hola Marcos, vamos a ver si me entiende tu sugerencia Imagine que obtengo mi control de CStatic/CWnd y agrego un CBitmap como miembro. Entonces, cada vez que se va a pintar el control (en el método OnPaint), ¿tengo que obtener el fondo y mezclarlo con mi imagen? –
(continuar) ¿Estoy en lo cierto? ¿Tengo que hacer todo por mi cuenta? Parece que puede tener un alto costo de rendimiento ... ¿podría (alguien) decirme la mejor manera (más óptima) para hacerlo? Tal vez algunos artículos godd o incluso codesnippet? Gracias. –