// ouverture du presse-papier if(!OpenClipboard()) return; // récupération du contenu du presse-papier (doît être une image) HGLOBAL hData = GetClipboardData(CF_DIB); // si la récupération a échoué, on referme le presse-papier if(!hData) { CloseClipboard(); return; } int size = GlobalSize(hData); LPBYTE lpData = (LPBYTE) GlobalLock(hData); LPBITMAPINFO lpInfo= (LPBITMAPINFO) lpData; LPBITMAPINFOHEADER lpHeader= &lpInfo->bmiHeader; LPBYTE lpBits = lpData + sizeof(BITMAPINFOHEADER); HDC hdc = ::GetDC(NULL); HBITMAP hBmp = ::CreateDIBitmap(hDC, lpHeader, CBM_INIT, lpBits, lpInfo,DIB_RGB_COLORS); ::ReleaseDC(NULL, hdc); CloseClipboard();
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionCImage cImage; cImage.Attach(hBmp); HBITMAP myhBmp = cImage.Detach(); //je sais c'est très con EmptyClipboard(); SetClipboardData(CF_BITMAP, myhBmp); CloseClipboard();
BOOL GetClipboardBitmap(HBITMAP* phBmp, SIZE* pSize) { // ouverture du presse-papier if(!OpenClipboard(NULL)) return FALSE; // vérification du format if(!IsClipboardFormatAvailable(CF_BITMAP)) { CloseClipboard(); return FALSE; } // récupération bitmap contenu dans le presse-papier HBITMAP hClipboardBmp = (HBITMAP) GetClipboardData(CF_BITMAP); if(hClipboardBmp == NULL) { CloseClipboard(); return FALSE; } // récupération infos sur le bitmap (dont la taille) BITMAP info; SIZE size; GetObject(hClipboardBmp, sizeof(BITMAP), &info); size.cx = info.bmWidth; size.cy = info.bmHeight; // DC de l'écran HDC hScreenDC = GetDC(NULL); // création DC et sélection de ce bitmap dedans HDC hClipboardDC = CreateCompatibleDC(hScreenDC); HBITMAP hOldClipboardBmp = (HBITMAP) SelectObject(hClipboardDC, hClipboardBmp); // création DC et bitmap en mémoire HDC hMemDC = CreateCompatibleDC(hScreenDC); HBITMAP hMemBmp = CreateCompatibleBitmap(hScreenDC, size.cx, size.cy); HBITMAP hOldMemBmp = (HBITMAP) SelectObject(hMemDC, hMemBmp); // recopie inversée for(int x = 0; x < size.cx; x++) { for(int y = 0; y < size.cy; y++) { COLORREF color = GetPixel(hClipboardDC, x, y); SetPixel(hMemDC, size.cx-x-1, y, color); } } // sélection anciens objets et destruction DC SelectObject(hClipboardDC, hOldClipboardBmp); SelectObject(hMemDC, hOldMemBmp); DeleteDC(hClipboardDC); DeleteDC(hMemDC); ReleaseDC(NULL, hdc); // fermeture presse-papier CloseClipboard(); *phBmp = hMemBmp; pSize->cx = size.cx; pSize->cy = size.cy; return TRUE; }
void SetClipboardBitmap(HBITMAP hBmp) { OpenClipboard(NULL); EmptyClipboard(); SetClipboardData(CF_BITMAP, hBmp); CloseClipboard(); }
int main(int argc, char* argv[]) { HBITMAP hBmp; SIZE size; GetClipboardBitmap(&hBmp, &size); SetClipboardBitmap(hBmp); return 0; } le HBITMAP récupérer par la première fonction (qui est une copie inversée de ce qui se trouvait dans le presse-papier) est remis dans le presse-papier. Il n'est pas à détruire par DeleteObject (le système le fera pour nous).