Как сохранить клиентскую область дочернего окна в растровый файл?

#c #winapi #visual-c #bitmapimage

#c #winapi #visual-c #bitmapimage

Вопрос:

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

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

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

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

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

Ответ №1:

 RECT rect     = {0};

GetWindowRect( hwnd, amp;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, amp;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 на ваше усмотрение ; )

Комментарии:

1. Проблема в ATL::CImage? Если да, я могу показать вам, как это сделать с помощью чистого winapi.

2. спасибо за любезность, пожалуйста, расскажите мне о шагах, которые я должен выполнить, чтобы сохранить изображение, отображаемое в дочернем окне, в объект HBITMAP……

3. Вы можете использовать CImage в Win32, просто #include <atlstr.h> и #include <atlimage.h>. Также #include <atlstr.h> , по-видимому, требуется CString.