#include <iostream>
#include <fstream>
using namespace std;
BOOL SaveBitmap(const BITMAP &bm,HDC hDC,HBITMAP hBitmap,LPCTSTR szFileName)
{
int nBitPerPixel = bm.bmBitsPixel;//获得颜色模式
int nW = bm.bmWidth;
int nH = bm.bmHeight;
int nPalItemC=bm.bmPlanes; //调色板项的个数
int nBmpInfSize=sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nPalItemC;//位图信息的大小
int nDataSize=(nBitPerPixel*nW+31)/32*4*nH;//位图数据的大小
//初始化位图信息
BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + nBmpInfSize;//sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + nDataSize;//文件总的大小
bfh.bfType = (WORD)0x4d42;//位图标志
char * p = new char[nBmpInfSize+nDataSize];//申请内存位图数据空间(包括信息头)
memset(p,0,nBmpInfSize);//将信息头的数据初始化为0
LPBITMAPINFOHEADER pBih = (LPBITMAPINFOHEADER) p;//位图信息头
pBih->biCompression = BI_RGB;
pBih->biBitCount = nBitPerPixel;//每个图元像素使用的位数
pBih->biHeight = nH;//高度
pBih->biWidth = nW;//宽度
pBih->biPlanes = 1;
pBih->biSize = sizeof(BITMAPINFOHEADER);
pBih->biSizeImage = nDataSize;//图像数据大小
char *pData=p+nBmpInfSize;
//DDB转换为DIB
::GetDIBits(hDC,hBitmap,0,nH,pData,(LPBITMAPINFO) pBih, DIB_RGB_COLORS);//获取位图数据
ofstream ofs(szFileName,ios::binary);
if(ofs.fail())
return FALSE;
ofs.write((const char*)&bfh, sizeof(BITMAPFILEHEADER));//写入位图文件头
ofs.write((const char*)pBih, nBmpInfSize);//写入位图信息数据
ofs.write((const char*)pData, nDataSize);//写入位图数据
return TRUE;
}
void main()
{
HWND hWnd=NULL;
::OpenClipboard(hWnd); // 打开剪贴板
HANDLE hBitmap = ::GetClipboardData(CF_BITMAP); // 获取剪贴板数据句柄
if(hBitmap==NULL)
{
return ;
}
HDC hDC = ::GetDC(hWnd); // 获取设备环境句柄
HDC hdcMem = CreateCompatibleDC(hDC); // 创建与设备相关的内存环境
SelectObject(hdcMem, hBitmap); // 选择对象
SetMapMode(hdcMem, GetMapMode(hDC)); // 设置映射模式
BITMAP bm; // 得到位图对象
GetObject(hBitmap, sizeof(BITMAP), &bm);
SaveBitmap(bm,hDC,(HBITMAP)hBitmap,"clip.bmp");
::ReleaseDC(hWnd, hDC); // 释放设备环境句柄
DeleteDC(hdcMem); // 删除内存环境
::CloseClipboard(); // 关闭剪贴板
}