Red de conocimiento informático - Material del sitio web - ¿Por qué la función BitBlt() no puede dibujar al agregar mapeo de coordenadas en VC?

¿Por qué la función BitBlt() no puede dibujar al agregar mapeo de coordenadas en VC?

Modo de mapeo: MM_ANISOTROPIC

Coordenada horizontal: aumentando hacia la derecha

Coordenada vertical: disminuyendo hacia abajo

Cuando la coordenada de origen es (0,0),

p>

Las coordenadas con coordenadas Y positivas suben por la ventana, mientras que todo lo dibujado está fuera de la ventana.

------------------------------------------- --------------------------------------------------

Memoria El DC configura el modo de mapeo, mientras que el DC del dispositivo no configura el modo de mapeo. Cuando BitBlt, debe usar cada punto del DC de memoria para dibujar hasta el punto correspondiente del DC del dispositivo y, dado que los modos de mapeo de los dos DC son diferentes, cada punto no se puede mapear correctamente. Por ejemplo, el punto con coordenadas 100,50 no es el mismo punto de coordenadas para la memoria DC y el dispositivo DC.

La lógica y secuencia correctas son:

Establecer el modo de mapeo del dispositivo DC,

Crear la memoria DC,

Dibujar la imagen,

Copia la imagen de la memoria DC al dispositivo DC:

Intenta usar BitBlt, no uses StretchBlt para COPIAR, por las siguientes razones:

1) Se requiere StretchBlt para estirar. Usando el algoritmo, la velocidad de ejecución definitivamente no es tan rápida como BitBlt

2) El estiramiento de StretchBlt distorsionará los gráficos. Eche un vistazo más de cerca a los siguientes 800 * 600. Después de usar StretchBlt para estirar a pantalla completa, será compatible con Windows. Al comparar el visor de imágenes después de estirar, encontrará que StretchBlt no es una buena opción. Después de la comparación, encontrará que StretchBlt es estúpido.

3) El algoritmo de estiramiento de imágenes tiene varios indicadores que deben tenerse en cuenta: uno es hacer que la imagen no esté lo más distorsionada posible y el otro es aumentar la velocidad de ejecución del algoritmo tanto como sea posible. . La relación entre los dos es una que aumenta y disminuye. StretchBlt no es tan bueno como algunos programas de imágenes profesionales para efectos de estiramiento. Esto se debe a que StretchBlt no es una función de procesamiento de imágenes profesional. Se utiliza principalmente para mejorar la velocidad de ejecución de la función, por lo que se distorsionará. Para evitar distorsiones, escriba su propio algoritmo de imagen.

Por lo tanto, básicamente no hay ninguna razón para utilizar StretchBlt.

Código fuente adjunto:

//El siguiente es el mapeo de coordenadas establecido

pDC->SetMapMode(MM_ANISOTROPIC); // La longitud de la unidad X, Y es from Definir modo de mapeo

pDC->SetWindowOrg(0,0); //Establece las coordenadas de la esquina superior izquierda de la ventana en

pDC->SetWindowExt(500,50); ); //Establece la medición de la ventana

pDC->SetViewportOrg(0,0);

pDC->SetViewportOrg(0,0);

pDC ->SetViewportExt(rect.right,rect.bottom);

mDC.CreateCompatibleDC(pDC);

//Crea una imagen del DC de la pantalla

CBitmap MemBitmap;

MemBitmap.CreateCompatibleBitmap(pDC);

mDC->SetViewportOrg(0,0);

pDC->SetViewportExt(rect.CreateCompatibleBitmap( pDC,500, 50); //Tenga en cuenta la configuración de dimensiones de tamaño para el mapa de bits de la memoria

//Reserve la memoria anterior y seleccione esta imagen en la memoria DC

CBitmap *pOldBitmap= mDC.SelectObject(pOldBitmap);

//MemBitmap.DeleteObject(); Esta línea no es necesaria, el destructor CBitmap realizará esta operación

.