#include <windows.h>
#include <atlimage.h> int __stdcall WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
HWND hwnd = ::GetDesktopWindow();
HDC hDC = ::GetDC(hwnd); //根据窗口来确定截图的大概位置 RECT rect;
::GetClientRect(hwnd, &rect);
HDC hDCMem = ::CreateCompatibleDC(hDC); HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom);
HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap); ::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY); //红色部分确定图片的大小位置
//BitBlt 该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。
//
CImage image;
image.Attach(hBitMap);
image.Save(TEXT("c:\\B.bmp"));
image.Detach(); ::SelectObject(hDCMem, hOldMap); //该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
::DeleteObject(hBitMap);
::DeleteDC(hDCMem);
::DeleteDC(hDC); return 0;
}::SelectObject(hDCMem, hOldMap);
图片都已经保存在硬盘上,这句不是多余吗.但是我注释掉之后,保存的图片是一片漆黑的,
这行代码选用了新的绘图对象,同时把旧的系统原有的绘图对象保存到 hOldMap 中::SelectObject(hDCMem, hOldMap);
这行代码放弃你刚选用了新的绘图对象,恢复上行保存在 hOldMap 中旧的系统原有的绘图对象。相当于你通常用黑笔写字,临时用彩笔画了个圈,画完了又恢复用黑笔写字。
//Do With hDCMem::SelectObject(hDCMem, hOldMap); //选择之前的 hOldMap