2010-06-29 22 views
5

Estoy escribiendo una función Win32 C++ no administrada que maneja un mapa de bits, y necesito recurrir a ella.Cómo dibujar en el controlador de mapa de bits dado (C++/Win32)?

Mi problema es que para dibujar necesito obtener un contexto de dispositivo, pero cuando lo hago GetDC (NULL), ¡me da un contexto de dispositivo para WINDOW! El parámetro para GetDC() es un identificador de ventana (HWND), pero no tengo una ventana; solo un manejador de mapa de bits.

¿Cómo puedo dibujar en este mapa de bits? ¡Gracias!

Respuesta

2

Además de la respuesta de Pavel, el "compatible con la pantalla" siempre me molestaba a mí también, pero como el CreateCompatibleDC(NULL) se usa universalmente para ese fin, asumo que es correcto.

Creo que lo "compatible" está relacionado solo con DDB (el DC está configurado para escribir en el tipo de DDB correcto para la pantalla actual), pero no afecta las lecturas/escrituras en DIB.

Por lo tanto, para estar seguro, siempre use DIB y no DDB si necesita trabajar en mapas de bits que no solo tienen que pasar temporalmente en pantalla, hoy en día la diferencia en el rendimiento es insignificante. Consulte here para obtener más información sobre DIB y DDB.

1

CreateCompatibleDC() y SelectObject() su mapa de bits en él.

Sin embargo, no todos los mapas de bits se pueden seleccionar en cualquier DC. Es posible que tenga que jugar con el modo de asignación y otras opciones de CD de memoria.

+0

Pero CreateCompatibleDC() toma un HDC como parámetro. Si tuviera un HDC, ¡no necesitaría crear uno! (¿Hay algo que estoy pasando por alto?) – user20493

+2

'CreateCompatibleDC' puede tomar NULL como parámetro y creará una memoria DC compatible con la pantalla de la aplicación. A continuación, puede seleccionar SelectObject su mapa de bits en él, como dijo Pavel, usted puede CreateCompatibleBitmap() y luego BitBlt() su original en el DC. –

+0

Estoy tratando de dibujar en un mapa de bits 8bpp. Esto, por supuesto, no es compatible con la pantalla de la aplicación. ¿Es posible recurrir a dicho mapa de bits? – user20493

0

El paradigma win32 básico para dibujar en un mapa de bits es que selecciona el mapa de bits en un contexto de dispositivo, después de lo cual, todas las operaciones de dibujo en ese contexto de dispositivo se almacenan en el mapa de bits. A continuación, utiliza una de las diversas operaciones 'blit' (por ejemplo, StretchBlt) para transferir esto a una superficie de visualización, que es solo el contexto del dispositivo de un área de cliente de ventana.

Otros han proporcionado mejores detalles, esta es solo la vista de alto nivel.

+0

Gracias por la respuesta, pero necesito almacenar imágenes de 8bpp, que no son compatibles con la pantalla. Esta es la fuente (sin juego de palabras) del problema. – user20493

+0

@alankdkd: bueno, nada dice que tienes que mostrar un mapa de bits, pero aún puedes usar las operaciones de GDI para dibujarlas de esta manera. Es posible que desee ver CreateDIBitmap() o CreateDIBSection() si necesita obtener organizaciones inusuales de píxeles. – JustJeff

0

Bueno, esto es un poco fuera de la caja .. supongo .. Pero sí sé que Graphics puede return a HDC y Graphics echar un Bitmap como un argumento a su ctor. A Bitmap a su vez puede ser created from a HBITMAP and a HPALETTE. El único problema aquí es que no sé si el argumento HPALETTE puede ser NULL.

Graphics* g; 
Bitmap* bitmap; 
HBITMAP _bitmap; // <- this one is yours 

bitmap = Bitmap::FromHBITMAP(_bitmap, NULL); 
g = new Graphics(bitmap); 

HDC hdc = g->GetHDC(); 

// when done, call g->ReleaseHDC(hdc); 

Sin embargo, yo le pido a recibir el HDC como un argumento a su función, así .. No creo que cualquier persona tendrá un mapa de bits y no tienen el DC a ella.
Si tiene estos problemas para encontrar un HDC en un HBITMAP, también lo harán todos los demás.

+0

Gracias por la sugerencia, pero esto tiene que ser en Win32 no administrado, que (desafortunadamente) no tiene la clase Graphics. – user20493

Cuestiones relacionadas