sousou_one
Messages postés34Date d'inscriptionmardi 19 juillet 2005StatutMembreDernière intervention 5 avril 2006
-
20 juil. 2005 à 11:51
lolquivole
Messages postés11Date d'inscriptiondimanche 13 juillet 2003StatutMembreDernière intervention20 juillet 2005
-
20 juil. 2005 à 21:44
salut à tous,
je veux construire une bitmap par copie d'une région d'une bitmap source, je dois prendre les nouvelles dimensions en sélectionnant la région à copier par la souris mais j'ai pas réussi.
Est ce que quelqu'un peut m'aider?
voilà mon code:
//*****************************************************************************
// GetBmpSize : récupère la taille d'un bitmap.
// entrée : hBmp : bitmap dont on souhaite récupérer la taille.
// retour : taille du bitmap spécifié.
//*****************************************************************************
SIZE GetBmpSize(HBITMAP hBmp)
{
// récupération des informations sur le bitmap
BITMAP bmpInfo;
GetObject(hBmp, sizeof(bmpInfo), &bmpInfo);
//*****************************************************************************
// RedimBmp : crée un bitmap en recopiant une zone d'un autre bitmap avec un
// redimensionnement éventuel.
// entrée : hdc : DC à utiliser pour créer les DCs compatibles (DC de la
// fenêtre principale ou de l'écran par exemple).
// hBmpSrc : bitmap source.
// rcSrc : zone du bitmap source à recopier ou {0,0,0,0} pour
// recopier l'intégralité.
// sizeDst : taille du bitmap de destination ou {0,0} pour calculer
// la taille à partir de rcSrc (pas de redimensionnement).
// retour : bitmap créé.
//*****************************************************************************
HBITMAP RedimBmp(HDC hdc, HBITMAP hBmpSrc, RECT rcSrc, SIZE sizeDst)
{
// taille du bitmap initial
SIZE sizeSrc = GetBmpSize(hBmpSrc);
// si rcSrc est à {0,0,0,0}, on prend toute l'image source
if(rcSrc.left==0 && rcSrc.top==0 && rcSrc.right==0 && rcSrc.bottom==0)
{
rcSrc.right = sizeSrc.cx;
rcSrc.bottom = sizeSrc.cy;
}
// vérification des bornes
if(rcSrc.left < 0)
rcSrc.left = 0;
if(rcSrc.top < 0)
rcSrc.top = 0;
if(rcSrc.right > sizeSrc.cx)
rcSrc.right = sizeSrc.cx;
if(rcSrc.bottom > sizeSrc.cy)
rcSrc.bottom = sizeSrc.cy;
// si sizeDst est à {0,0}, on ne fait pas de redimensionnement
if(sizeDst.cx==0 && sizeDst.cy==0)
{
sizeDst.cx = rcSrc.right-rcSrc.left;
sizeDst.cy = rcSrc.bottom-rcSrc.top;
}
//création de DCs compatibles et du bitmap de destination
HDC hDCSrc = CreateCompatibleDC(hdc);
HDC hDCDst = CreateCompatibleDC(hdc);
HBITMAP hBmpDst = CreateCompatibleBitmap(hdc, sizeDst.cx, sizeDst.cy);
// sélection des bitmaps dans les DCs (avec sauvegarde des anciens)
HBITMAP hOldBmpSrc = (HBITMAP)SelectObject(hDCSrc, hBmpSrc);
HBITMAP hOldBmpDst = (HBITMAP)SelectObject(hDCDst, hBmpDst);
// sélection des anciens bitmaps dans les DCS
SelectObject(hDCSrc, hOldBmpSrc);
SelectObject(hDCDst, hOldBmpDst);
// destruction des DCs
DeleteDC(hDCSrc);
DeleteDC(hDCDst);
// retour
return hBmpDst;
}
//*****************************************************************************
// DrawBmp : dessine un bitmap dans un DC.
// entrée : hdc : DC où dessiner le bitmap.
// x : coordonnée en x où dessiner le bitmap.
// y : coordonnée en y où dessiner le bitmap.
// hBmp : bitmap à dessiner.
//*****************************************************************************
void DrawBmp(HDC hdc, int x, int y, HBITMAP hBmp)
{
// création d'un DC compatible pour y sélectionner le bitmap à dessiner
HDC hDCBmp = CreateCompatibleDC(hdc);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hDCBmp, hBmp);
// sélection ancien bitmap et destruction du DC
SelectObject(hDCBmp, hOldBmp);
DeleteDC(hDCBmp);
}
//*****************************************************************************
// WndProc : procédure de traitement des messages de la fenêtre principale.
//*****************************************************************************
lolquivole
Messages postés11Date d'inscriptiondimanche 13 juillet 2003StatutMembreDernière intervention20 juillet 2005 20 juil. 2005 à 21:44
Salut,
Ce que tu fais la dans le code n'a pas d'intérêt, on aura pt1=pt2 parce
que tu le prends l'un après l'autre; et donc ton bitmap ne sera pas
dessiné...
La solution que je te propose, pour la selection, c'est de traiter les
messages WM_LBUTTONDOWN et WM_LBUTTONUP: lorsque tu obtiens un message
WM_LBUTTONDOWN, tu mets dans une var globale la pos. de la souris, et
lorsque il y a WM_LBUTTONUP, tu compares la position de la souris
actuelle avec celle de la variable pour créer ton rect, et enfin
afficher ton sprite.