Obtenir le bitmap d’un CF_DIBV5 à partir du presse-papier

J’essaie d’obtenir des données bitmap du presse-papiers. Je peux réussir à obtenir les informations d’en-tête pour l’object CF_DIBV5 :

  BOOLEAN exists = IsClipboardFormatAvailable(CF_DIBV5) && OpenClipboard(session->windowHandle); if (exists) { HGLOBAL clipboard = GetClipboardData(CF_DIBV5); exists = clipboard != NULL; if (exists) { LPTSTR lptstr = GlobalLock(clipboard); exists = lptstr != NULL; if (exists) { BITMAPV5HEADER * header = clipboard; //now need the HBITMAP! } } } //... 

Je peux enregistrer avec succès les informations de l’en-tête. Maintenant, je veux le HBITMAP pour pouvoir le transférer dans GetDIBits . La documentation dit que CF_DIBV5 est un BITMAPV5HEADER “suivi des informations d’espace colorimésortingque bitmap et des bits bitmap”.

Cette dernière partie me confond ironiquement parce que c’est dans un anglais simple. Je suppose que pour obtenir les bits bitmap, j’ai besoin d’append la taille de l’en-tête et les “informations d’espace colorimésortingque” au pointeur d’en-tête. Alors

 HBITMAP bitmap = header + sizeof(BITMAPV5HEADER) + /* ???? */; 

Je pense…

Comment connaître la taille de cette mystérieuse information sur l’espace colorimésortingque? Et les “bits bitmap” sont-ils littéralement un HBITMAP tel que l’expression ci-dessus serait vraie?

Je peux peut-être négliger l’évidence puisque je suis un débutant en C.

Mise à jour: Je réalise maintenant, en HBITMAP et en relisant certains documents, qu’un HBITMAP est un DDB, alors que j’ai un HBITMAP DIB. Donc, GetDIBits n’est pas la bonne fonction pour moi. Quelle fonction peut être utilisée pour convertir n’importe quelle DIB en un format sans compression?

Voici comment obtenir le pointeur approprié sur les bits bitmap. La disposition du contenu dépend du type de compression et du nombre de bits décrits dans l’en-tête.

 HGLOBAL clipboard = GetClipboardData(CF_DIBV5); BITMAPV5HEADER* bitmapV5Header = (BITMAPV5HEADER*)GlobalLock(clipboard); int offset = bitmapV5Header->bV5Size + bitmapV5Header->bV5ClrUsed * sizeof(RGBQUAD); if (bitmapV5Header->bV5Compression == BI_BITFIELDS) offset += 12; //bit masks follow the header BYTE *bits = (BYTE*)bitmapV5Header + offset;