Red de conocimiento informático - Material del sitio web - Se agregó el mapeo de coordenadas a VC, ¿por qué no puedo dibujar la función BitBlt()?

Se agregó el mapeo de coordenadas a VC, ¿por qué no puedo dibujar la función BitBlt()?

Modo de textura: MM _Anisotropía

Abscisa: aumenta hacia la derecha

Coordenada vertical: disminuye hacia abajo

Cuando la coordenada de origen es (0, 0)

Si la coordenada y es positiva, irá hasta la parte superior de la ventana y todo lo que dibujes estará fuera de la ventana.

-

El DC de memoria tiene configurado el modo de mapeo, pero el DC del dispositivo no tiene configurado el modo de mapeo. Cuando BitBlt, cada punto del DC de la memoria debe dibujarse al punto correspondiente del DC del dispositivo. Debido a que los métodos de mapeo de los dos DC son diferentes, cada punto no se puede mapear correctamente. Por ejemplo, el punto con coordenadas 100,50 es diferente de los puntos de coordenadas de la memoria DC y del dispositivo DC.

La lógica y secuencia correctas son:

Establecer el modo de mapeo del dispositivo DC,

Crear un DC de memoria,

Dibujar ,

Copie la imagen en la memoria DC al dispositivo DC:

Intente usar BitBlt en lugar de StretchBlt para copiar. Las razones son:

1) StretchBlt requiere un algoritmo y su velocidad de ejecución definitivamente no es tan rápida como BitBlt.

2) El estiramiento de StretchBlt distorsionará los gráficos. Mire más de cerca la siguiente imagen de 800 * 600, use StretchBlt para estirarla a pantalla completa y compárela con el visor de imágenes que viene con Windows. Encontrará que StretchBlt es estúpido.

3) Hay varios indicadores que deben considerarse en el algoritmo de estiramiento de imágenes: el primero es hacer que la imagen esté lo más libre de distorsión posible y el segundo es aumentar la velocidad de ejecución del algoritmo. todo lo posible. Hay una compensación entre uno y dos. ¡Si quieres fidelidad, pierdes velocidad! StretchBlt no es tan bueno como algunos programas de imágenes profesionales porque StretchBlt no es una función de procesamiento de imágenes profesional. Se utiliza principalmente para mejorar la velocidad de ejecución de esta función, por lo que se distorsionará. Si desea evitar la distorsión, escriba su propio algoritmo de imagen.

Así que básicamente no hay razón para usar StretchBlt.

Código fuente adjunto:

//El siguiente es el mapeo de coordenadas.

pDC->;SetMapMode(MM_Anisotropy); //Personaliza el modo de mapeo de las unidades de longitud X e Y.

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

pDC->; //Establece la medida de la ventana

pDC->SetViewportOrg(0, 0,

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

//Crea una imagen de la pantalla DC

CBitmap MemBitmap

MemBitmap. CreateCompatibleBitmap(pDC, 500, 50); //Preste atención a la configuración del tamaño del mapa de bits de la memoria.

//Conserva la memoria anterior, selecciona esta imagen para ingresar a la memoria DC.

CBitmap *pOldBitmap=mDC. Seleccionar objeto (ampMemBitmap);

//La siguiente es una línea recta.

CPen PenWave(PS_SOLID, 5, RGB(255, 0, 255)); //Crea un PenWave morado.

mDC. seleccionar objeto(onda de pluma);

mDC. MoveTo(0,0);

mDC.

LineTo(50, 50);

//Copie el contenido dibujado en la memoria DC al DC actual a la vez.

pDC->; BitBlt(0, 0, 500, 50 amp; mDC, 0, 0, copia src);

//Reciclaje de recursos

mDC. seleccionar objeto(pOldBitmap);

//MemBitmap. eliminar objeto(); Esta línea es innecesaria, el destructor CBitmap lo hará.