建一个DC 把窗口上的画面拷贝过去
// 保存窗口上的画面为32位bmp,细节方面自己控制
HDC hSrcDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
HDC hMemDC = CreateCompatibleDC(hSrcDC);
RECT rect;
GetClientRect(hwnd, &rect); // 得到客户区矩形
BITMAPFILEHEADER bmHeader; // 位图文件头
BITMAPINFOHEADER bmInfHdr; // 位图信息头
memset(&bmHeader, 0, sizeof(BITMAPFILEHEADER));
memset(&bmInfHdr, 0, sizeof(BITMAPINFOHEADER));
bmHeader.bfType = 19778; // "BM", 0x424D
bmHeader.bfSize = 54 + (rect.right * rect.bottom << 2); // 文件大小 = 文件头大小(14) + 信息头大小(40) + 像素大小
bmHeader.bfOffBits = 54; // 像素起始位置
bmInfHdr.biSize = sizeof(BITMAPINFOHEADER); // 结构大小
bmInfHdr.biWidth = rect.right; // 宽
bmInfHdr.biHeight = rect.bottom; // 高
bmInfHdr.biPlanes = 1;
bmInfHdr.biBitCount = 32; // 32bit/pixel
bmInfHdr.biCompression = BI_RGB;
HBITMAP hBitmap = CreateCompatibleBitmap(hSrcDC, rect.right, rect.bottom);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
MapWindowPoints(hwnd, HWND_DESKTOP, (LPPOINT)&rect, 2);
BitBlt(hMemDC, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hSrcDC, rect.left, rect.top, SRCCOPY); // 拷贝画面
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
DeleteDC(hSrcDC);
DeleteDC(hMemDC);
DeleteObject(hOldBitmap);
BYTE *bytes = new BYTE[bmHeader.bfSize - 54];
FILE *fp = _tfopen(_T("E:\\test.bmp"), _T("wb")); // 创建文件
GetBitmapBits(hBitmap, bmHeader.bfSize - 54, bytes); // 获得像素,是颠倒的,需要翻转一下,我没处理
fwrite(&bmHeader, sizeof(BITMAPFILEHEADER), 1, fp); // 写文件头
fwrite(&bmInfHdr, sizeof(BITMAPINFOHEADER), 1, fp); // 写信息头
fwrite(bytes, bmHeader.bfSize - 54, 1, fp); // 写像素
fclose(fp); // 关闭文件
DeleteObject(hBitmap);
delete [] bytes;