// TODO: 在此添加命令处理程序代码
HWND hwnd = this->GetSafeHwnd(); //得到窗口句柄
HDC hDC = ::GetWindowDC(hwnd);//获取DC 指定的窗口的设备环境
// CDC* pDc = GetWindowDC();
//CBitmap m_bm;
//m_bm.CreateCompatibleBitmap()
RECT rect;
GetWindowRect(&rect);//获取屏幕大小 该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
HDC hDCMem = ::CreateCompatibleDC(hDC);//创建兼容DC 创建一个与指定设备兼容的内存设备上下文环境(DC)。
//CreateCompatibleDC(hDC);
//CreateCompatibleBitmap(hDC, rect.right - rect.left, rect.bottom - rect.top);
HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right - rect.left, rect.bottom - rect.top);//该函数创建与指定的设备环境相关的设备兼容的位图。
HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap);//将位图选入DC,并保存返回值
::BitBlt(hDCMem, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hDC, 0, 0, SRCCOPY);//将屏幕DC的图象拷贝到内存DC中
CImage image;//须要#include <atlimage.h>
image.Attach(hBitMap);
image.Save(_T("c://aaavvv.jpg"));//假设文件后缀为.bmp,则保存为为bmp格式
image.Detach();
::SelectObject(hDCMem, hOldMap);//选入上次的返回值
//释放
::DeleteObject(hBitMap);
::DeleteDC(hDCMem);
::DeleteDC(hDC);
//CreateCompatibleBitmap()
//BitBlt()
CClientDC dc(GetDesktopWindow());
方法二:
// TODO: 在此添加控件通知处理程序代码
//获取当前窗口的 HDC
HDC hDc = ::GetWindowDC(m_hWnd);
//在内存中,初始化一个与当前窗口兼容的 HDC
HDC hdcmem;
hdcmem = CreateCompatibleDC(hDc);
//使用当前窗口的HDC, 初始化一个 HBitMap 对象指针
HBITMAP hbmap = CreateCompatibleBitmap(hDc, 800, 600);
//将内存的HDC 选入设备为位图
HBITMAP oldbmap = (HBITMAP)::SelectObject(hdcmem, hbmap);
//将 hDC中的数据拷贝至内存数据中
::BitBlt(hdcmem, 0, 0, 800, 600, hDc, 0, 0, SRCCOPY);
//图像的处理
CImage img;
img.Attach(hbmap);
img.Save(_T("E:\\0000\\eqeq.jpg"));
img.Detach();
img.Destroy();
::SelectObject(hdcmem, oldbmap);
img.Destroy();
DeleteDC(hDc);
DeleteDC(hdcmem);
DeleteObject(hbmap);
方法二:
// TODO: 在此添加控件通知处理程序代码、
static int num = 0;
CString str;
str.Format(_T("%d"), num);
CRect rect;
GetWindowRect(&rect);
//1、根据当前窗口的句柄,获取本窗口的HDC
HDC hDc_Screen = ::GetWindowDC(m_hWnd);
//HDC hDc = ::GetWindowDC(m_hWnd);
//2、在内存中,根据窗口句柄,初始化一个内存HDCMem
HDC hDcMem = CreateCompatibleDC(hDc_Screen);
//3、根据窗口句柄,初始化一个 HBitMap
HBITMAP hbm = CreateCompatibleBitmap(hDc_Screen, rect.right - rect.left, rect.bottom - rect.top);
//4、在内存HDC中,选取 HBitMap 位图, 实现了HbitMap 和 内存 HDCMem 的关联
HBITMAP oldbitmap = (HBITMAP)::SelectObject(hDcMem, hbm);
//5、将位图从当前窗口 HDC 拷贝到内存 HDCMem 中
BitBlt(hDcMem, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hDc_Screen, 0,0, SRCCOPY);
//6、初始化一个 CImage img 对象
CImage img;
//7、将img 对象与 HBitMap 关联
img.Attach(hbm);
//8、保存图像
img.Save(_T("E:\\0000\\aa_"+str+".jpg"));
num++;
//9、将 img 对象与HBitMap 分离
img.Detach();
SelectObject(hDcMem, oldbitmap);
//10、释放、删除对象
DeleteObject(hbm);
DeleteDC(hDcMem);
DeleteDC(hDc_Screen);