如何将子窗口的客户区保存为位图文件?

8
我使用核心WIN32和VC++创建了一个Windows应用程序。在我的父窗口中,我有一个子窗口和两个按钮“保存”和“发送”。
当用户单击“保存”按钮时,我希望打开savefileDialog,并且用户应该能够将图像保存为位图文件。
同样的文件应该使用WinSock API发送给远程用户... 我的问题是,我不知道如何将窗口的屏幕截图保存为位图文件...
请帮助我解决这个问题... 我没有使用MFC、ATL或WTL...
提前感谢您的帮助,
1个回答

10
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的实现留给你处理;)


1
问题出在 ATL::CImage 上吗?如果是的话,我可以向您展示如何使用纯 WinAPI 解决它。 - Mike Kwan
感谢您的好意,请简要告诉我应该遵循哪些步骤将显示在子窗口中的图像保存到HBITMAP对象中... - Amit
你可以在Win32中使用CImage,只需#include <atlstr.h>和#include <atlimage.h>。另外#include <atlstr.h>,它需要CString显然。 - Pierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接