Как сохранить клиентскую область дочернего окна в файл растрового изображения? - PullRequest
7 голосов
/ 10 мая 2011

Я создал приложение для Windows с использованием ядра WIN32 и VC ++.В родительском окне у меня есть дочернее окно и две кнопки «сохранить» и «отправить».

Когда пользователь нажимает кнопку «Сохранить», я хочу, чтобы savefileDialog был открыт, и пользователь должен иметь возможность сохранитьизображение в виде растрового файла.

Этот же файл должен быть отправлен удаленному пользователю с помощью WinSock API .... Моя проблема в том, что я не знаю, как сохранить снимок экрана окна вфайл растрового изображения ...

, пожалуйста, помогите мне в этом ... Я не использовал MFC, ATL или WTL ....

заранее спасибо,

1 Ответ

11 голосов
/ 10 мая 2011
RECT rect     = {0};

GetWindowRect( hwnd, &rect );
ATL::CImage* image_ = new CImage();
image_ -> Create( rect.right - rect.left, rect.bottom - rect.top, 32 );

HDC device_context_handle = image_ -> GetDC();
PrintWindow( hwnd, device_context_handle, PW_CLIENTONLY );
image_ -> Save( filename );
image_ -> ReleaseDC();

delete image_;

PrintWindow() должно сработать.

Чтобы сохранить как HBITMAP:

HDC hDC       = GetDC( hwnd );
HDC hTargetDC = CreateCompatibleDC( hDC );
RECT rect     = {0};

GetWindowRect( hwnd, &rect );

HBITMAP hBitmap = CreateCompatibleBitmap( hDC, rect.right - rect.left,
    rect.bottom - rect.top );
SelectObject( hTargetDC, hBitmap );
PrintWindow( hwnd, hTargetDC, PW_CLIENTONLY );
SaveBMPFile( filename, hBitmap, hTargetDC, rect.right - rect.left,
    rect.bottom - rect.top );

DeleteObject( hBitmap );
ReleaseDC( hwnd, hDC );
DeleteDC( hTargetDC );

Я оставлю реализацию SaveBMPFile на ваше усмотрение; ) * +1010 *

...