Printwindow печатает с пустым пространством - PullRequest
0 голосов
/ 07 марта 2019

Ширина и высота приложения Melon составляет 438 x 615 пикселей, а функция :: GetWindowRect () захватывает его правильно.

Однако функция :: PrintWindow () рисует меньший размер, который составляет 348 x 489 пикселей,остальные из них заполнены черным пробелом (можно ничего не рисовать)

... пусть одна картинка будет лучше, чем сотни описаний.

вот результат кода

bool result = true;

HWND appHWnd = ::FindWindow(nullptr, TEXT("Melon"));

RECT appWindowRect; ::GetWindowRect(appHWnd, &appWindowRect);
HDC appDC = ::GetWindowDC(appHWnd);
//    HDC appDC = ::GetDC(appHWnd); // same issue occured either
//    HDC appDC = ::GetDC(nullptr);
HDC memoryDC = ::CreateCompatibleDC(appDC);

HBITMAP capturedScreenBitmap = ::CreateCompatibleBitmap(
    appDC,
    appWindowRect.right - appWindowRect.left,
    appWindowRect.bottom - appWindowRect.top
);

HBITMAP memoryBitmap = static_cast<HBITMAP>(::SelectObject(memoryDC, capturedScreenBitmap));

result = ::PrintWindow(appHWnd, memoryDC, 0);

//copy to clipboard
OpenClipboard(nullptr);
EmptyClipboard();
SetClipboardData(CF_BITMAP, capturedScreenBitmap);
CloseClipboard();

::SelectObject(memoryDC, memoryBitmap);
::DeleteObject(capturedScreenBitmap);
::DeleteDC(memoryDC);
::ReleaseDC(appHWnd, appDC);

Странно, C # версия кода работает правильно.импортировать одну и ту же библиотеку user32, использовать ее и вывести другой результат?почему?

1 Ответ

0 голосов
/ 12 марта 2019

Это будет зависеть от понимания DPI - Дэвид Хеффернан

:: GetWindowRect, который раньше использовался для проектов c # и консолей C ++ в Visual Studio, не зависит от масштабирования с учетом dpi. но то, что раньше использовалось в qt studio, от этого зависит.

вот мое решение.

RECT appWindowRect; {
    ::GetWindowRect(hwnd, &appWindowRect);
}

POINT appWindowSize; {
    qreal dotsPerInch = QApplication::screens().at(0)->logicalDotsPerInch();
    appWindowSize.x = static_cast<LONG>((appWindowRect.right - appWindowRect.left) * 96 / dotsPerInch);
    appWindowSize.y = static_cast<LONG>((appWindowRect.bottom - appWindowRect.top) * 96 / dotsPerInch);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...