Red de conocimiento informático - Conocimiento sistemático - Ideas claras, código principal, buscando un programa completo.

Ideas claras, código principal, buscando un programa completo.

Hay algunos errores en el código, te ayudaré a corregirlos:

#include lt; windows.hgt

#include atltypes. hgt;

HBITMAP CopyScreenToBitmap(LPRECT lpRect) //lpRect representa el área seleccionada

{

HDC hScrDC, hMemDC

/ / Tabla de descripción del dispositivo de memoria y pantalla

HBITMAP hBitmap, hOldBitmap;

// Mango de mapa de bits

int nX, nY, nX2, nY2;

// Coordenadas del área seleccionada

int nWidth, nHeight;

// Ancho y alto del mapa de bits

int xScrn, yScrn; p> // Resolución de pantalla

// Asegúrese de que el área seleccionada no sea un rectángulo vacío

if (IsRectEmpty(lpRect))

return NULL; /p>

//Crea una tabla de descripción de dispositivo para la pantalla

hScrDC = CreateDC(L"DISPLAY", NULL, NULL, NULL

//Describe el screen device Table crea una tabla de descripción de dispositivos de memoria compatibles

hMemDC = CreateCompatibleDC(hScrDC

// Obtiene las coordenadas del área seleccionada

nX = lpRect); -gt; izquierda ;

nY = lpRect-gt; arriba;

nX2 = lpRect-gt;

// Obtener la resolución de la pantalla

xScrn = GetDeviceCaps(hScrDC, HORZRES

yScrn = GetDeviceCaps(hScrDC, VERTRES); p> // Asegúrate de que el área seleccionada sea visible

if (nX lt; 0)

nX = 0

if (nY lt; 0)

nY = 0;

si (nX2 gt; xScrn)

nX2 = xScrn

si (nY2 gt; yScrn)

nY2 = yScrn;

nWidth = nX2 - nX;

nHeight = nY2 - nY

// Crear un contexto de dispositivo compatible con el mapa de bits de pantalla

hBitmap=CreateCompatibleBitmap(hScrDC, n

Ancho, nHeight);

//Seleccione el nuevo mapa de bits en la tabla de descripción del dispositivo de memoria

hOldBitmap=(HBITMAP)SelectObject(hMemDC, hBitmap); //Copia la tabla de contexto del dispositivo de pantalla a la tabla de contexto del dispositivo de memoria

BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY

/ /Obtener el identificador del mapa de bits de la pantalla

hBitmap=(HBITMAP)SelectObject(hMemDC, hOldBitmap

//Borrar

DeleteDC(hScrDC); /p>

DeleteDC(hMemDC);

// Devuelve el identificador del mapa de bits

return hBitmap

}

int SaveBitmapToFile; (HBITMAP hBitmap, LPCWSTR lpFileName) //hBitmap es el identificador del mapa de bits de la pantalla en este momento

{ //lpFileName es el nombre del archivo de mapa de bits

HDC hDC

//Tabla de descripción del dispositivo

int iBits

//El número de bytes ocupados por cada píxel bajo la resolución de pantalla actual

WORD wBitCount

p>

//El número de bytes ocupados por cada píxel en el mapa de bits

//Definir el tamaño de la paleta, el tamaño de bytes de los píxeles en el mapa de bits, el tamaño del archivo de mapa de bits y escriba las palabras del archivo Número de secciones

DWORD dwPaletteSize=0, dwBmBitsSize, dwDIBSize, dwWritten

BITMAP Bitmap

//Estructura de atributos de mapa de bits<; /p>

BITMAPFILEHEADER bmfHdr;

//Estructura del encabezado del archivo de mapa de bits

BITMAPINFOHEADER bi

//Estructura del encabezado de la información del mapa de bits

LPBITMAPINFOHEADER lpbi

// Señala la estructura del encabezado de información del mapa de bits

HANDLE fh, hDib, hPal

HPALETTE hOldPal=NULL

//Definir archivo, asignar identificador de memoria, identificador de paleta

//Calcular el número de bytes ocupados por cada píxel del archivo de mapa de bits

hDC = CreateDC(L" DISPLAY", NULL , NULL, NULL);

iBits = GetDeviceCaps(hDC, BITSPIXEL) *

GetDeviceCaps(hDC, PLANES);

DeleteDC(

hDC);

si (iBits lt; = 1)

wBitCount = 1

si no (iBits lt; = 4)

wBitCount = 4;

más si (iBits lt; = 8)

wBitCount = 8

más si (iBits lt; = 24)

wBitCount = 24;

else

wBitCount = 32

//Calcular el tamaño de la paleta

if ( wBitCount lt; = 8)

dwPaletteSize=(1 lt; lt; wBitCount)*sizeof(RGBQUAD);

//Establece la estructura del encabezado de información del mapa de bits

GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap

bi.biSize = sizeof(BITMAPINFOHEADER

bi.biWidth = Bitmap.bmWidth ; >

bi.biHeight = Bitmap.bmHeight;

bi.biPlanes = 1;

bi.biBitCount = wBitCount

bi .biCompression = BI_RGB;

bi.biSizeImage = 0;

bi.biXPelsPerMeter = 0;

bi.biYPelsPerMeter = 0; = 0;

bi.biClrImportant = 0;

dwBmBitsSize = ((Bitmap.bmWidth*wBitCount 31)/32)*4*Bitmap.bmHeight; > p>

//Asignar memoria para el contenido del mapa de bits

/*xxxxxxxx Calcular el tamaño del mapa de bits y descomponerlo (explica la declaración anterior)xxxxxxxxxxxxxxxxxxxx

//Cada línea de escaneo El número de bytes ocupados debe ser un múltiplo entero de 4. El algoritmo específico es:

int biWidth = (Bitmap.bmWidth*wBitCount) / 32

if((Bitmap. bmWidth *wBitCount) 32)

biWidth; // No es un múltiplo entero más 1

biWidth *= 4; // En este punto, los bytes calculados de cada número de línea de escaneo.

dwBmBitsSize = biWidth * Bitmap.bmHeight; //Obtener el tamaño

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/

hDib = GlobalAlloc(GHND, dwBmBitsSize dwPaletteSize sizeof(BITMAPINFOHEADER)) ;

lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib

*lpbi = bi

// Paleta de proceso

hPal = GetStockObject(DEFAULT_PALETTE);

if (hPal)

{

hDC = ::GetDC(NULL

hOldPal= SelectPalette); (hDC, (HPALETTE)hPal, FALSE);

RealizePalette(hDC)

}

// Obtener nuevos píxeles bajo este valor de paleta

GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi sizeof(BITMAPINFOHEADER) dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS

/ /Restaurar paleta<); /p>

if (hOldPal)

{

SelectPalette(hDC, hOldPal, TRUE

RealizePalette(hDC

);

::ReleaseDC(NULL, hDC);

}

//Crear archivo de mapa de bits

fh=CreateFile( lpFileName, GENERIC_WRITE, 0, NULL , CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (fh==INVALID_HANDLE_VALUE)

return FALSE

// Establece el encabezado del archivo de mapa de bits

bmfHdr.bfType = 0x4D42; // "BM"

dwDIBSize=sizeof(BITMAPFILEHEADER) sizeof(BITMAPINFOHEADER) dwPaletteSize dwBmBitsSize

bmfHdr.bfSize = dwDIBSize; /p>

bmfHdr.bfReservado1 = 0;

bmfHdr.bfReservado

ed2 = 0;

bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) (DWORD)sizeof(BITMAPINFOHEADER) dwPaletteSize

// Escribir encabezado de archivo de mapa de bits

WriteFile(fh, (LPSTR) & bmfHdr, sizeof(BITMAPFILEHEADER), & dwWritten, NULL

// Escribe el resto del archivo de mapa de bits

WriteFile (fh, ( LPSTR)lpbi, sizeof(BITMAPINFOHEADER) dwPaletteSize dwBmBitsSize, amp; dwWritten, NULL

//Borrar

GlobalUnlock(hDib)

GlobalFree(hDib);

CloseHandle(fh);

devuelve VERDADERO

}

int main(void)

{

RECT rect;

rect.left = 0;

rect.top = 0

rect .right = GetSystemMetrics (SM_CXSCREEN);

rect.bottom = GetSystemMetrics(SM_CYSCREEN);

HBITMAP hMap = CopyScreenToBitmap(amp;rect);

SaveBitmapToFile( hMap, L"); C:\\seu07201213(HOHO).bmp");

devuelve 0;

}