Red de conocimiento informático - Material del sitio web - Cómo crear un efecto de imagen giratoria en VC

Cómo crear un efecto de imagen giratoria en VC

// RotateDIB: crea un nuevo mapa de bits con una imagen rotada

/ Returns: devuelve un nuevo mapa de bits con una imagen rotada

/ hDIB: independiente del dispositivo para rotar el mapa de bits

/ fDegrees: el ángulo de rotación en grados

/ clrBack: el color de los píxeles en el mapa de bits generado que no están cubiertos por los píxeles de origen

//

HDIB RotateDIB(HDIB hDIB, double fDegrees, COLORREF clrBack)

{

WaitCursorBegin();

// Obtener información de mapa de bits de origen

LPBITMAPINFO lpBmInfo = (LPBITMAPINFO)GlobalLock(hDIB);

int bpp = lpBmInfo-gt; bmiHeader.biBitCount; // Bits por píxel

int nColors = lpBmInfo; -gt; bmiHeader.biClrUsed ? lpBmInfo-gt; bmiHeader.biClrUsed:

.biWidth;

int nColors = lpBmInfo-gt; biHeight;

int nRowBytes = ((((nWidth * bpp) 31) amp;~ 31)/ 8);

// Asegúrese de que la altura sea positiva y biCompression sea BI_ RGB o BI_BITFIELDS

Compresión DWORD = lpBmInfo-gt; bmiHeader.biCompression;

if( nHeight lt; 0 || (compresión!=BI_RGB))

{

GlobalUnlock(hDIB);

WaitCursorEnd();

devuelve NULL

}

LPBYTE; lpDIBBits = FindDIBBits((LPBYTE)lpBmInfo);

// Convertir grados de ángulo a radianes

#define PI 3.1415926

radianes dobles = (fDegrees/90.0) *(PI/2);

// Calcula el coseno y el seno solo una vez

float cosine = (float)cos(radianes);

float seno = (float)sin(radianes);

// Calcular el tamaño del mapa de bits generado

// Calcular el tamaño del mapa de bits generado

// Primero obtenga las coordenadas de las tres esquinas excepto el origen

int x1 = (int)(- nHeight * seno);

int y1 = (int)( nAltura * coseno);

int x2 = (int)(nAncho * coseno - nAltura * seno);

int y2 = (int)(nAltura); * coseno nAncho * seno);

int x3 = (int)( nAncho * coseno

int y3 = (int)(nAncho * seno); p> int minx = min(0, min(x1, min(x2, x3)))

int miny = min(0, min(y1, min(y2, y3))); /p>

int maxx = max(x1, max(x2, x3));

int maxy = max(y1, max(y2, y3)); int w = maxx - minx;

int h = maxy - miny;

// Crea un DIB para guardar los resultados

int nResultRowBytes = ((( ( w * bpp) 31) amp; ~31)/ 8);

long len = nResultRowBytes * h

int nHeaderSize = (( LPBYTE)lpDIBBits-(LPBYTE)lpBmInfo ) ;

HANDLE hDIBResult = GlobalAlloc(GHND, len nHeaderSize);

// Inicializa la información del encabezado

LPBITMAPINFO lpBmInfoResult = (LPBITMAPINFO)GlobalLock(hDIBResult)

memcpy( (void*)lpBmInfoResult, (void*) lpBmInfo, nHeaderSize

lpBmInfoResult-gt; - gt; bmiHeader.biSizeImage = h;

lpBmInfoResult-gt; bmiHeader.biSizeImage = len

LPBYTE lpDIBBitsResult = FindDIBBits((LPBYTE)lpBmInfoResult

// Obtener el valor del color de fondo (índice)

ZeroMemory(lpDIBBitsResult, len);

DWORD dwBackColor;

switch(bpp)

{

caso 1: // Monocromo

if( clrBack == RGB(255, 255, 255) )

memset( lpDIBBitsResult, 0xff , len );

break;

caso 4:

<

p>caso 8: //Buscar tabla de colores

. Buscar tabla de colores

int i;

for(i = 0; i lt; nColors; i )

{

if( lpBmInfo-gt; bmiColors[i].rgbRed == GetRValue(clrBack) )

{

if(bpp==4) i = ilt;lt;4;

memset( lpDIBBitsResult, i, len

break

}

}

}

p>

// Si no se encuentra ningún color coincidente, el color permanece negro

break;

caso 16:

/ / Windows95 admite los 5 bits de cada color, o 5 bits de cada uno para rojo y azul

// Windows95 admite 5 bits de cada uno para todos los colores, o 5 bits de cada uno para rojo y azul

// 6 bits para verde - Verifique la máscara de color RGB555 o RGB565

if( *((DWORD*)lpBmInfo-gt;bmiColors) == 0x7c00 )

{

El mapa de bits es negro

descanso;

caso 16:

// Windows 95 admite 5 bits cada uno para todos los colores o 5 bits para el rojo amp p> // El mapa de bits es RGB555

dwBackColor = ((GetRValue(clrBack)gt; 3) lt; lt; 10)

(( GetRValue(clrBack)gt; gt; 3)

}

else

{

// El mapa de bits es RGB565

dwBackColor = ((GetRValue(clrBack)gt;gt;3) lt;lt;11)

( (GetRValue(clrBack)gt; gt; 2) lt; lt; 5)

(GetBValue(clrBack)gt; gt; 3)

}

break;

caso 24:

caso 32:

dwBackColor = (((DWORD)GetRValue(clrBack)) lt ; lt; 16)|

(((DWORD)GetGValue(clrBack)) lt; lt; 8)

(((DWORD)GetBValue(clrBack))); /p>

descanso ;

}