Découpage d'une image prise du presse papier

Fermé
totodude - 22 mars 2004 à 18:35
 Utilisateur anonyme - 23 mars 2004 à 00:48
Bonjour tout le monde,

je cherche à développer une application en C++ qui réalise une impression écran, la récupère dans le presse papier, découpe une partie de l'image puis remet l'image découpée dans le presse papier.

Mon probleme ce situe au moment de la découpe.
en effet, j'arrive a récupérer mon image mais pas à la découper et la remettre dans le presse papier.

voici ce que j'ai fait :

Code:

//impression écran
INPUT input[2];
::ZeroMemory(input, sizeof(input));
input[0].type = input[1].type = INPUT_KEYBOARD;
input[0].ki.wVk = input[1].ki.wVk = VK_SNAPSHOT;
input[1].ki.dwFlags = KEYEVENTF_KEYUP; // THIS IS IMPORTANT
::SendInput(2, input, sizeof(INPUT));

// ouverture du presse-papier
if(!OpenClipboard())
{
AfxMessageBox("OpenClipboard failed",MB_OK,0);
return;
}
else AfxMessageBox("first OpenClipboard ok",MB_OK,0);

// récupération du contenu du presse-papier (doit être une image)
HGLOBAL hData = GetClipboardData(CF_DIB);

// si la récupération a échoué, on referme le presse-papier
if(!hData)
{
CloseClipboard();
AfxMessageBox("il n'y a rien dans le presse papier",MB_OK,0);
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);
//GlobalUnlock(hData);

//maintenant que j'ai récupéré mon objet je peux travailler dessus

CRect myRect = new CRect(0,0,400,400);
CImage cImage;
cImage.Attach(hBmp);
CImage myImage = cutImage(cImage,myRect);

HBITMAP myhBmp = myImage.Detach();
if(myhBmp==NULL)
AfxMessageBox( "myhBmp est null" );

if(EmptyClipboard()==0)
AfxMessageBox( "EmptyClipboard failed" );
else AfxMessageBox( "EmptyClipboard ok" );

if(SetClipboardData(CF_BITMAP, myhBmp)==NULL)
{
AfxMessageBox( "SetClipboardData failed" );
EmptyClipboard();
}
else AfxMessageBox( "SetClipboardData ok" );
CloseClipboard();





avec ma fonction cutImage suivante :
Code:

CImage cutImage(CImage cImage,CRect myRect)
{
CImage newImage;
int width = myRect.BottomRight().x-myRect.TopLeft().x;
int height = myRect.BottomRight().y-myRect.TopLeft().y;
newImage.Create(width,height,cImage.GetBPP());
for(int x=0;x<width;x++)
{
for(int y=0;y<height;y++)
{
newImage.SetPixel(x,y,cImage.GetPixel(x,y));
}
}

return newImage;
}



en fait je n'ai pas d'erreur ni à la compilation ni à l'exécution, mais lorsque je fais ctrl+V pour coller l'image contenu dans le presse papier dans paint, j'ai une erreur "Erreur d'obtention des données du presse papier".

j'ai réalisé moi meme la fonction cutImage car je n'ai pas trouvé dans les bibliothèque standarts l'équivalent.

si vous voyez ou st mon erreur, merci de me faire signe., ca m'aiderais vraiment.

bonne soirée

tom

1 réponse

Utilisateur anonyme
23 mars 2004 à 00:48
je ne peux pas t'aider mais je remonte ton post (tu peux aussi le faire de temps en temps, c'est tout à fait régulier)

ne serait-ce que parce qu'il est admirablement conforme à la charte (-:

kinder.surprise,
le maton du matou
2