1 //把剪切板中的图片保存到图片
2 HWND hWnd=GetSafeHwnd();
3 ::OpenClipboard(hWnd); // 打开剪贴板
4 HANDLE hBitmap = ::GetClipboardData(CF_BITMAP); // 获取剪贴板数据句柄
5 if(hBitmap==NULL)
6 {
7 return ;
8 }
9 HDC hDC = ::GetDC(hWnd); // 获取设备环境句柄
10 HDC hdcMem = CreateCompatibleDC(hDC); // 创建与设备相关的内存环境
11 SelectObject(hdcMem, hBitmap); // 选择对象
12 SetMapMode(hdcMem, GetMapMode(hDC)); // 设置映射模式
13 BITMAP bm; // 得到位图对象
14 GetObject(hBitmap, sizeof(BITMAP), &bm);
15 DeleteFile("c:\\clip.bmp");
16 SaveBitmap(bm,hDC,(HBITMAP)hBitmap, "c:\\clip.bmp");
17 ::ReleaseDC(hWnd, hDC); // 释放设备环境句柄
18 DeleteDC(hdcMem); // 删除内存环境
19 ::CloseClipboard(); // 关闭剪贴板
20 }
1 //保存到本地函数
2 BOOL SaveBitmap(const BITMAP &bm,HDC hDC,HBITMAP hBitmap,LPCTSTR szFileName)
3 {
4
5 int nBitPerPixel = bm.bmBitsPixel;//获得颜色模式
6 int nW = bm.bmWidth;
7 int nH = bm.bmHeight;
8 int nPalItemC=bm.bmPlanes; //调色板项的个数
9 int nBmpInfSize=sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nPalItemC;//位图信息的大小
10 int nDataSize=(nBitPerPixel*nW+31)/32*4*nH;//位图数据的大小
11 //初始化位图信息
12 BITMAPFILEHEADER bfh = {0};//位图文件头
13 bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + nBmpInfSize;//sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
14 bfh.bfSize = bfh.bfOffBits + nDataSize;//文件总的大小
15 bfh.bfType = (WORD)0x4d42;//位图标志
16 char * p = new char[nBmpInfSize+nDataSize];//申请内存位图数据空间(包括信息头)
17 memset(p,0,nBmpInfSize);//将信息头的数据初始化为0
18 LPBITMAPINFOHEADER pBih = (LPBITMAPINFOHEADER) p;//位图信息头
19 pBih-> biCompression = BI_RGB;
20 pBih-> biBitCount = nBitPerPixel;//每个图元像素使用的位数
21 pBih-> biHeight = nH;//高度
22 pBih-> biWidth = nW;//宽度
23 pBih-> biPlanes = 1;
24 pBih-> biSize = sizeof(BITMAPINFOHEADER);
25 pBih-> biSizeImage = nDataSize;//图像数据大小
26 char *pData=p+nBmpInfSize;
27 //DDB转换为DIB
28 ::GetDIBits(hDC,hBitmap,0,nH,pData,(LPBITMAPINFO) pBih, DIB_RGB_COLORS);//获取位图数据
29 ofstream ofs(szFileName,ios::binary);
30 if(ofs.fail())
31 return FALSE;
32 ofs.write((const char*)&bfh, sizeof(BITMAPFILEHEADER));//写入位图文件头
33 ofs.write((const char*)pBih, nBmpInfSize);//写入位图信息数据
34 ofs.write((const char*)pData, nDataSize);//写入位图数据
35 return TRUE;
36 }
1 //加载本地图片 并绘制
2
3 HBITMAP hBitmap = (HBITMAP) ::LoadImage(NULL, "c:\\clip.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
4 HDC hDC = ::GetDC(GetSafeHwnd()); // 获取设备环境句柄
5 HDC hdcMem = CreateCompatibleDC(hDC); // 创建与设备相关的内存环境
6 SelectObject(hdcMem, hBitmap); // 选择对象
7 BITMAP bm; // 得到位图对象
8 GetObject(hBitmap, sizeof(BITMAP), &bm);
9
10 BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); //位图复制
11 ::ReleaseDC(GetSafeHwnd(), hDC); // 释放设备环境句柄
12 DeleteDC(hdcMem); // 删除内存环境
13 ::CloseClipboard(); // 关闭剪贴板