Другие языки программирования и технологии

Помогите написать программу для создания скришотов на С++

Написать программу на С++ в Вorland C++ Builder, которая позволяет создавать скриншоты окон, сохранять их и тиражировать.
Ссылку модерация не пропускает, по-этому выкладываю код

void CaptureScreen(HWND window)
{
//Получаем прямоугольную область экрана
RECT windowRect;
GetWindowRect(window, &windowRect);

//Размеры битмэпа
int bitmap_dx = windowRect.right-windowRect.left;
int bitmap_dy = windowRect.bottom-windowRect.top;

BITMAPINFOHEADER bmpInfoHeader;
BITMAPFILEHEADER bmpFileHeader;
BITMAP* pBitmap;

bmpFileHeader.bfType = 0x4d42;
bmpFileHeader.bfSize = 0;
bmpFileHeader.bfReserved1 = 0;
bmpFileHeader.bfReserved2 = 0;
bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

bmpInfoHeader.biSize = sizeof(bmpInfoHeader);
bmpInfoHeader.biWidth = bitmap_dx;
bmpInfoHeader.biHeight = bitmap_dy;
bmpInfoHeader.biPlanes = 1;
bmpInfoHeader.biBitCount = 24;
bmpInfoHeader.biCompression = BI_RGB;
bmpInfoHeader.biSizeImage = bitmap_dx*bitmap_dy*(24/8);
bmpInfoHeader.biXPelsPerMeter = 0;
bmpInfoHeader.biYPelsPerMeter = 0;
bmpInfoHeader.biClrUsed = 0;
bmpInfoHeader.biClrImportant = 0;

BITMAPINFO info;
info.bmiHeader = bmpInfoHeader;

BYTE* memory;
HDC winDC = GetWindowDC(window);
HDC bmpDC = CreateCompatibleDC(winDC);
//Создаем битмэп
HBITMAP bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**)&memory, NULL, 0);
SelectObject(bmpDC, bitmap);//Выбираем в контекст битмэп
BitBlt(bmpDC, 0, 0, bitmap_dx, bitmap_dy, winDC, 0, 0, SRCCOPY);
ReleaseDC(window, winDC);

OPENFILENAME ofn;//Указатель на структуру с данными инициализации диалогового окна
char strFilter[] = "Файлы данных *.bmp\0";
char strFileName[MAX_PATH] = "";
memset(&ofn, 0, sizeof(OPENFILENAME));//Обнуление ofn
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = window;
ofn.lpstrFilter = strFilter;
ofn.lpstrFile = strFileName;//Буфер для имени файла
ofn.nMaxFile = MAX_PATH;//Размер файла
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;
strcpy(strFileName, ofn.lpstrFile);
GetSaveFileName(&ofn); //MessageBox(hwnd,"Невозможно сохранить файл","О программе... ",MB_ICONINFORMATION);
HANDLE hFile = CreateFile(
ofn.lpstrFile,
GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
return;
DWORD dwWritten = 0;
WriteFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile(hFile, &bmpInfoHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
WriteFile(hFile, memory, bmpInfoHeader.biSizeImage, &dwWritten, NULL);
CloseHandle(hFile);
}
Igor Kulzhanov
Igor Kulzhanov
9 759
Лучший ответ
HWND hDesktop = GetDesktopWindow();
RECT rc;
GetWindowRect(hDesktop, &rc);
int nWidth = rc.right - rc.left;
int nHeight = rc.bottom - rc.top;
HDC hDesktopDC = GetDC(hDesktop);
HDC hDC = CreateCompatibleDC(hDesktopDC);
HBITMAP hBmp = CreateCompatibleBitmap(hDesktopDC, nWidth, nHeight);
HGDIOBJ hOld = SelectObject(hDC, hBmp);
BitBlt(hDC, 0, 0, nWidth, nHeight, hDesktopDC, rc.left, rc.top, SRCCOPY);
SelectObject(hDC, hOld);
DeleteDC(hDC);
ReleaseDC(hDesktop, hDesktopDC);

// осталось засунуть в буфер обмена или сохранить в файл
DeleteObject(hBmp);
лучше на C++ в QT такое сделать быстрее можно будет если вам нужно по скорее
Максим Е
Максим Е
13 816
Помогите, или сделайте все за тебя?
Голова то у тебя, не только шапку носить.