复制位图到剪贴板


复制一幅位图到剪贴板相当简单,需要记住的一个是如果位图需要调色盘,
你应当将调色盘也复制。
函数一:复制设备相关位图到剪贴板 CopyBitmapToClipboard()函数复制一幅DDB位图到剪贴板,如果提供调色盘它将 同时复制调色盘。注意在最后调用Detach()。这一点很重要,因为此时GDI对象 的物主已经传送至剪贴板。 // CopyBitmapToClipboard - Copies a device-dependent bitmap to clipboard // pWnd - Pointer to window that opens the clipboard // bitmap - The device-dependent bitmap // pPal - Pointer to logical palette - Can be NULL // NOTE - GDI objects are detached from bitmap & pPal // as the clipboard owns them after the copy void CopyBitmapToClipboard( const CWnd *pWnd, CBitmap& bitmap, CPalette* pPal ) { ::OpenClipboard(pWnd->GetSafeHwnd()); ::EmptyClipboard() ; if( pPal ) ::SetClipboardData (CF_PALETTE, pPal->GetSafeHandle() ) ; ::SetClipboardData (CF_BITMAP, bitmap.GetSafeHandle() ) ; ::CloseClipboard () ; bitmap.Detach(); if( pPal ) pPal->Detach(); }

函数二:复制设备无关位图到剪贴板 CopyDIBToClipboard()函数和CopyBitmapToClipboard()非常相似。内存句柄包 含了BITMAPINFO 和位图的位信息,通过GlobalAlloc()分配。 // CopyDIBToClipboard - Copies a device-dependent bitmap to clipboard // pWnd - Pointer to window that opens the clipboard // hDIB - Memory handle that contains BITMAPINFO & bitmap bits // pPal - Pointer to logical palette - Can be NULL // NOTE - GDI objects are detached from bitmap & pPal // as the clipboard owns them after the copy void CopyDIBToClipboard( const CWnd *pWnd, HGLOBAL hDIB, CPalette* pPal ) { ::OpenClipboard(pWnd->GetSafeHwnd()); ::EmptyClipboard(); if( pPal ) ::SetClipboardData (CF_PALETTE, pPal->GetSafeHandle() ) ; ::SetClipboardData (CF_DIB, hDIB ) ; ::CloseClipboard () ; bitmap.Detach(); if( pPal ) pPal->Detach(); }

函数三:复制一幅windows图象到剪贴板 void CopyWndToClipboard( CWnd *pWnd ) { CBitmap bitmap; CClientDC dc(pWnd); CDC memDC; CRect rect; memDC.CreateCompatibleDC(&dc); pWnd->GetWindowRect(rect); bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() ); CBitmap* pOldBitmap = memDC.SelectObject(&bitmap); memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY); pWnd->OpenClipboard() ; EmptyClipboard() ; SetClipboardData (CF_BITMAP, bitmap.GetSafeHandle() ) ; CloseClipboard () ; memDC.SelectObject(pOldBitmap); bitmap.Detach(); } 函数四:从文件中导入Bmp文件 BOOL LoadBitmapFromBMPFile( LPTSTR szFileName, HBITMAP *phBitmap, HPALETTE *phPalette ) { BITMAP bm; *phBitmap = NULL; *phPalette = NULL; // Use LoadImage() to get the image loaded into a DIBSection *phBitmap = (HBITMAP)LoadImage( NULL, szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE ); if( *phBitmap == NULL ) return FALSE; // Get the color depth of the DIBSection GetObject(*phBitmap, sizeof(BITMAP), &bm ); // If the DIBSection is 256 color or less, it has a color table if( ( bm.bmBitsPixel * bm.bmPlanes ) <= 8 ) { HDC hMemDC; HBITMAP hOldBitmap; RGBQUAD rgb[256]; LPLOGPALETTE pLogPal; WORD i; // Create a memory DC and select the DIBSection into it hMemDC = CreateCompatibleDC( NULL ); hOldBitmap = (HBITMAP)SelectObject( hMemDC, *phBitmap ); // Get the DIBSection's color table GetDIBColorTable( hMemDC, 0, 256, rgb ); // Create a palette from the color tabl pLogPal = (LOGPALETTE *)malloc( sizeof(LOGPALETTE) + (256*sizeof(PALETTEENTRY)) ); pLogPal->palVersion = 0x300; pLogPal->palNumEntries = 256; for(i=0;i<256;i++) { pLogPal->palPalEntry[i].peRed = rgb[i].rgbRed; pLogPal->palPalEntry[i].peGreen = rgb[i].rgbGreen; pLogPal->palPalEntry[i].peBlue = rgb[i].rgbBlue; pLogPal->palPalEntry[i].peFlags = 0; } *phPalette = CreatePalette( pLogPal ); // Clean up free( pLogPal ); SelectObject( hMemDC, hOldBitmap ); DeleteDC( hMemDC ); } else // It has no color table, so use a halftone palette { HDC hRefDC; hRefDC = GetDC( NULL ); *phPalette = CreateHalftonePalette( hRefDC ); ReleaseDC( NULL, hRefDC ); } return TRUE; }

 

实现代码如下:

void CTestDragFileDlg::OnButton1() { CImage mmage; //判断剪贴板的数据格式是否可以处理 CBitmap m_bitmap; HBITMAP hBitmap; HPALETTE hPalette; HANDLE hde; //打开剪贴板 if(!OpenClipboard()) {return;} if( !LoadBitmapFromBMPFile( "C://aaa.bmp", &hBitmap, &hPalette ) ) return ; if( hPalette ) hde= ::SetClipboardData (CF_PALETTE, hPalette ) ; hde=SetClipboardData (CF_BITMAP,hBitmap ) ; if(!IsClipboardFormatAvailable(CF_BITMAP)) { return; } HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP); mmage.Attach(handle); IStream * pStmImage=NULL; HGLOBAL hMemBmp=GlobalAlloc(GMEM_MOVEABLE,0); if(hMemBmp==NULL) return; CreateStreamOnHGlobal(hMemBmp,false,&pStmImage); if (pStmImage==NULL) { GlobalFree(hMemBmp); return; } mmage.Save(pStmImage,Gdiplus::ImageFormatJPEG); BYTE *pbyBmp=(BYTE*)GlobalLock(hMemBmp); UINT mysize; mysize=GlobalSize(hMemBmp); CFile mfile("C://bbb.bmp",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); //内存中明明有内容,这里保存0字节大小的文件 mfile.Write(pbyBmp,mysize); mfile.Close(); pStmImage->Release(); GlobalFree(hMemBmp); if(mmage)mmage.Destroy(); GlobalUnlock(hMemBmp); CloseClipboard(); }

你可能感兴趣的:(复制位图到剪贴板)