2010-05-06 15 views
7

Como recién llegado relativamente al equipo MFC, veo mucho los Contextos del dispositivo (DC). I vagamente entiendo que tiene algo que ver con el dibujo, pero los detalles no están muy bien explicados en ningún lugar que pueda encontrar. ¿Qué significa crear un "Contexto de dispositivo compatible" y por qué es importante? ¿Qué hace SelectObject y cómo debo hacer que un DC sea compatible primero?Descripción de los contextos del dispositivo

Respuesta

11

Un contexto de dispositivo es simplemente un lugar donde se produce el dibujo, por lo que si tiene dos DC diferentes, está dibujando en dos lugares diferentes. Algo así como un manejador de archivo.

Contextos del dispositivo pueden referirse a bienes raíces en la pantalla, o a mapas de bits que solo residen en la memoria, y probablemente en otros lugares, también, esos son los dos que puedo pensar en este momento.

Los contextos compatibles son los que tienen la misma organización subyacente de píxeles, lo que significa cantidad de bits por píxel, bytes por píxel, organización del color, etc. Los contextos de los dispositivos de mapa de bits de memoria pueden tener cualquier organización que desee, pero los contextos de su pantalla se relacionarán (eventualmente) con los almacenamientos intermedios en su tarjeta gráfica, que (según el modo, etc.) tendrán una organización de píxeles muy específica.

Tener contextos compatibles significa que es eficiente transferir datos de imágenes entre ellos, porque se requiere poca o ninguna traducción de los datos. En el otro extremo, si tiene una paleta de 256 colores, un mapa de 8 bits e intenta ajustarla a una pantalla que tiene 8 bits cada uno de RGBA por píxel, cada último píxel requerirá un masaje significativo a medida que se copia y, por lo tanto, copiar es incompatible. bitmaps es mucho más lento. De acuerdo con la documentación de Win32 SDK, al menos BitBlt() y StretchBlt() "convierten el formato de color de la fuente para que coincida con el formato de destino", por lo que se puede hacer.

Investigar CreateCompatibleDC() y CreateCompatibleBitmap() como puntos de partida para crear contextos de dibujo que sean compatibles con los ya existentes.

SelectObject() controla qué recursos están activos actualmente en el contexto del dispositivo. Un contexto tiene un lápiz, un pincel, una fuente y un mapa de bits actuales. Estas hacen que muchas de las otras llamadas GDI sean más simples al permitirle especificar menos parámetros. Por ejemplo, no tiene que especificar la fuente cuando utiliza TextOut(), pero si desea cambiar la fuente, aquí es donde entra en juego SelectObject(). Si alimenta a SelectObject() un identificador a una fuente, la devolución valor es un identificador de la fuente que estaba en vigor, y las operaciones posteriores utilizan la nueva fuente. El comportamiento es el mismo para los otros tipos de recursos, bolígrafos, pinceles, etc.

+0

¡Gracias! Algunas preguntas de seguimiento sobre eso, entonces: ¿Se pueden usar DC no compatibles y aún tener un programa de trabajo (aunque sea mucho más lento)? ¿Y dónde aparece SelectObject en el concepto de Compatibilidad de contexto de dispositivo? – Smashery

+0

@Smashery: editado un poco para abordar mejor esos problemas. – JustJeff

+0

Gracias - ¡una respuesta muy clara y útil! – Smashery

Cuestiones relacionadas