剪切板中的图片处理
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(); // 关闭剪贴板