Cómo crear un efecto de imagen giratoria en VC
/ 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 p>
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>
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 ;
}