Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Por qué la función BitBlt() en VC no puede dibujar un mapa? Acabo de aprender VC y soy un novato entre los novatos. ¡Espero que puedan ayudarme!

¿Por qué la función BitBlt() en VC no puede dibujar un mapa? Acabo de aprender VC y soy un novato entre los novatos. ¡Espero que puedan ayudarme!

Modo de dibujo: MM_ANISOTROPIC

Abscisa: aumenta hacia la derecha

Coordenada vertical: disminuye hacia abajo

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

La coordenada p>

Y, si es positiva, sube hasta la parte superior de la ventana y todo lo que se dibuja queda fuera de la ventana.

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

La memoria DC establece el modo de asignación y el dispositivo DC no establece el modo de asignación. Cuando BitBlt, debe usar cada punto del DC de la memoria para dibujar hasta el punto correspondiente del DC del dispositivo. Dado que los dos DC tienen modos de mapeo diferentes, cada punto no se puede mapear correctamente. Por ejemplo, un punto con coordenadas 100,50 no es el mismo punto de coordenadas que 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 el efecto de estiramiento producido por algunos programas de imágenes profesionales. 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-gt; SetMapMode(MM_ANISOTROPIC); es el modo de mapeo personalizado

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

pDC-gt; , 50); / /Establecer métricas de ventana

pDC-gt;SetViewportOrg(0,0);

pDC-gt;SetViewportOrg(0,0);

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

mDC.CreateCompatibleDC(pDC);

//Crea una imagen del DC de la pantalla

CBitmap MemBitmap;

MemBitmap.CreateCompatibleBitmap(pDC);

mDC-gt; SetViewportExt(rect.CreateCompatibleBitmap (pDC, 500, 50); //Tenga en cuenta la configuración de dimensiones de tamaño para el mapa de bits de 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

.