Получить снимок окна и обрезать его

У меня следующий код работает правильно, он делает снимок активного окна в моем приложении, помещает его в переменную HBITMAP и сохраняет его в файл.
Теперь я хотел бы иметь возможность обрезать изображение и сохранить только его часть в соответствии с заданными начальными координатами и шириной / высотой.

Важным моментом является то, что я должен сохранить окно с заголовком, не только клиентская область, так что это было легко сделать с помощью PrintWindow (), а не подхода BitBlt ().

Я предпочитаю решение, которое будет использовать PrintWindow (), потому что подход BitBlt () не принимает строку заголовка должным образом (если вы не знаете способ сделать это).

Текущий код, который работает правильно для всего окна:

HWND hParentWindow = GetActiveWindow();

RECT rc;
GetWindowRect(hParentWindow, &rc);
int width = rc.right - rc.left;
int height = rc.bottom - rc.top;

//create
HDC hdcParent = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcParent);
HBITMAP hBmp = CreateCompatibleBitmap(hdcParent, width, height);
SelectObject(hdc, hBmp);

//Print to memory hdc
PrintWindow(hParentWindow, hdc, 0);

//copy to clipboard
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBmp);
CloseClipboard();

// Save it in a file:
saveBitmap(ofn.lpstrFile, hBmp);

//release
DeleteDC(hdc);
DeleteObject(hBmp);
ReleaseDC(NULL, hdcParent);

Как я могу сохранить растровое изображение обрезанным?

0

Решение

По сути, сделать битблт. Вот нить, обсуждающая эту проблему, с решением, которое кажется подходящим для ваших нужд:

Функция кадрирования BitBlt (…)

0

Другие решения

  • создать еще один промежуточный HDC
  • Распечатайте окно для этого промежуточного HDC.
  • скопируйте (bitblt) нужный вам прямоугольник из этого HDC в ваш растровый HDC
  • перевести промежуточный HDC
0