#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); 
图片都已经保存在硬盘上,这句不是多余吗.但是我注释掉之后,保存的图片是一片漆黑的,

解决方案 »

  1.   

    HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap); 
    这行代码选用了新的绘图对象,同时把旧的系统原有的绘图对象保存到 hOldMap 中::SelectObject(hDCMem, hOldMap);  
    这行代码放弃你刚选用了新的绘图对象,恢复上行保存在 hOldMap 中旧的系统原有的绘图对象。相当于你通常用黑笔写字,临时用彩笔画了个圈,画完了又恢复用黑笔写字。     
      

  2.   

    正确用法:hOldMap = ::SelectObject(hDCMem, hNewMap);//hOldMap 保存的是 hNewMap 之前的 hSomeMap
    //Do With hDCMem::SelectObject(hDCMem, hOldMap); //选择之前的 hOldMap