2012-09-18 11 views
6

Cómo dibujar texto con color transparente usando WinAPI? De manera habitual utilicé SetBkMode (hDC, TRANSPARENT), pero ahora necesito usar doble buffer. De esta manera las imágenes dibujan correctamente, pero el texto no es correcto (con fondo negro).Cómo dibujar texto con fondo transparente usando C++/WinAPI?

case WM_PAINT: 
{ 
    hDC = BeginPaint(hWnd, &paintStruct); 
    SetBkMode(hDC, TRANSPARENT); 

    HDC cDC = CreateCompatibleDC(hDC); 
    HBITMAP hBmp = CreateCompatibleBitmap(hDC, width, height); 
    HANDLE hOld = SelectObject(cDC, hBmp); 

    HFONT hFont = (HFONT)SelectObject(hDC, font); 
    SetTextColor(cDC, color); 
    SetBkMode(cDC, TRANSPARENT); 

    TextOut(cDC, 0, 0, text, wcslen(text)); 

    SelectObject(cDC, hFont); 

    BitBlt(hDC, 0, 0, width, height, cDC, 0, 0, SRCCOPY); 

    SelectObject(cDC, hOld); 
    DeleteObject(hBmp); 
    DeleteDC(cDC); 

    EndPaint(hWnd, &paintStruct); 
    return 0; 
} 

Respuesta

2

Cuando crea un mapa de bits, el color no se especifica. La documentación no indica cómo se inicializó, pero el negro sólido (todos los ceros) parece probable. Como está dibujando el texto en el mapa de bits, el fondo del mapa de bits permanece en negro. A continuación, copia todo el mapa de bits en el DC y aparecen todos los píxeles, el fondo junto con el texto.

Para solucionar esto, debe copiar el fondo deseado en el mapa de bits antes de dibujar el texto.

+0

De esta manera funciona) No como esperaba, pero funciona. algunas regiones con fondo negro, pero creo que puedo arreglarlas. ¡Gracias! – Alexander

8

SetBkMode(dc, TRANSPARENT) debería funcionar bien todavía. Asegúrate de estar usando la manija correcta de DC cuando dibujes en tu buffer posterior.

+0

Utilicé esta función para DC, native, que obtengo de BeginBaint (...) y compatible, que obtengo de CreateCompatibleDC (...) ... – Alexander

+0

Debe usarlo para el mismo DC que estás dibujando texto para. ¿Qué API de dibujo de texto estás llamando? ¿Qué tipo de DC y mapa de bits está dibujando? – tenfour

+0

Lo que hago: crear dc compatible, crear mapa de bits compatible, seleccionar objeto, setbkmode, dibujar (con dc compatible), bitblt, seleccionar objeto, eliminar objeto, eliminar dc. Las imágenes se dibujan correctamente, pero el texto se dibuja con fondo negro (( – Alexander