OVH Cloud OVH Cloud

Aligner une Bitmap sur les bords de la PictureBox

4 réponses
Avatar
drummy
Bonjour;
Quels sont les propriétés à modifier pour aligner les bords d'une image
chargée d'un .BMP sur ceux d'une PictureBox quelles que soient les tailles
de ces 2 éléments? L'équivalent d'un "stretch to fit" quoi.
Merci d'avance
David

4 réponses

Avatar
Christian ASTOR
drummy a écrit:
Quels sont les propriétés à modifier pour aligner les bords d'une image
chargée d'un .BMP sur ceux d'une PictureBox quelles que soient les tailles
de ces 2 éléments? L'équivalent d'un "stretch to fit" quoi.



Une "PictureBox" n'est pas un contrôle Win32.
C'est plutôt un static SS_BITMAP.
Il suffit de stretcher la bitmap par CopyImage() ou StretchBlt() par un
Memory DC puis STM_SETIMAGE.
Avatar
drummy
merci bcp
"Christian ASTOR" a écrit dans le message de
news:40d5dbbe$0$308$

drummy a écrit:
> Quels sont les propriétés à modifier pour aligner les bords d'une image
> chargée d'un .BMP sur ceux d'une PictureBox quelles que soient les


tailles
> de ces 2 éléments? L'équivalent d'un "stretch to fit" quoi.

Une "PictureBox" n'est pas un contrôle Win32.
C'est plutôt un static SS_BITMAP.
Il suffit de stretcher la bitmap par CopyImage() ou StretchBlt() par un
Memory DC puis STM_SETIMAGE.



Avatar
Drummy
Quelle est mon erreur, le résultat n'affiche qu'une PictureBox entièrement
noire:
(si je mets hBmp à la place de hCpyBmp tout en bas ça m'affiche bien l'image
non étendue, donc elle est bien chargée)
HBITMAP hBmp,hCpyBmp;

BITMAP laSrcBmp,laDstBmp;

RECT PicSize;

HDC hdcSrc,hdcDst;

HBITMAP hSrcBmp,hDstBmp;

hdcSrc=CreateCompatibleDC(NULL);

hdcDst=CreateCompatibleDC(NULL);

hBmp = (HBITMAP)
LoadImage(0,"Intro.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_LOADMAP3DCOLORS|
LR_SHARED );

GetWindowRect(hPic,&PicSize);

hCpyBmp=CreateCompatibleBitmap(hdcDst,PicSize.right-PicSize.left,PicSize.bot
tom-PicSize.top);

hSrcBmp=(HBITMAP)SelectObject(hdcSrc,hBmp);

hDstBmp=(HBITMAP)SelectObject(hdcDst,hCpyBmp);

GetObject(hBmp,sizeof(laSrcBmp),&laSrcBmp)

GetObject(hCpyBmp,sizeof(laDstBmp),&laDstBmp)

BitBlt(hdcDst,0,0,laDstBmp.bmWidth,laDstBmp.bmHeight,hdcSrc,0,0,SRCCOPY);

SelectObject(hdcSrc,hSrcBmp);

DeleteDC(hdcSrc);

SelectObject(hdcDst,hDstBmp);

DeleteDC(hdcDst);

SendMessage(hPic,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hCpyBmp);

"drummy" a écrit dans le message de
news:40d66815$0$285$
merci bcp
"Christian ASTOR" a écrit dans le message de
news:40d5dbbe$0$308$
>
> drummy a écrit:
> > Quels sont les propriétés à modifier pour aligner les bords d'une


image
> > chargée d'un .BMP sur ceux d'une PictureBox quelles que soient les
tailles
> > de ces 2 éléments? L'équivalent d'un "stretch to fit" quoi.
>
> Une "PictureBox" n'est pas un contrôle Win32.
> C'est plutôt un static SS_BITMAP.
> Il suffit de stretcher la bitmap par CopyImage() ou StretchBlt() par un
> Memory DC puis STM_SETIMAGE.
>




Avatar
castorix
"Drummy" wrote in message news:<40d6a74f$0$295$...
Quelle est mon erreur, le résultat n'affiche qu'une PictureBox entièrement
noire:
hCpyBmp=CreateCompatibleBitmap(hdcDst,PicSize.right-PicSize.left,PicSize.bot



C'est le CreateCompatibleBitmap() qui ne doit pas être compatible avec
un Memory DC, mais avec le Screen DC, sinon il sera monochrome.

Et StretchBlt() , pas BitBlt(), si tu veux stretcher.

Une de mes vieilles fonctions (un peu l'équivalent de CopyImage()) =>

HBITMAP CopyBitmap(HANDLE hBitmap, int nType, int nWidth, int nHeight)
{
HDC hDC = GetDC(NULL);
HDC hDCMem = CreateCompatibleDC(hDC);
HDC hDCMem2 = CreateCompatibleDC(hDC);
BITMAP bm;
HBITMAP hBitmapReturn;
if (nType == IMAGE_BITMAP)
GetObject(hBitmap, sizeof(BITMAP), &bm);
else if (nType == IMAGE_ICON)
{
ICONINFO ii;
GetIconInfo((HICON)hBitmap, &ii);
GetObject(ii.hbmColor, sizeof(BITMAP), &bm);
}
if (nWidth == 0 && nHeight == 0)
{
nWidth = bm.bmWidth;
nHeight = bm.bmHeight;
}
hBitmapReturn = CreateCompatibleBitmap(hDC, nWidth, nHeight);
HBITMAP hBitmapOld = (HBITMAP)SelectObject(hDCMem, hBitmapReturn);
HBITMAP hBitmapOld2 = (HBITMAP)SelectObject(hDCMem2, hBitmap);
SetStretchBltMode(hDCMem, COLORONCOLOR);
PatBlt(hDCMem, 0, 0, nWidth, nHeight, WHITENESS);
if (nType == IMAGE_BITMAP)
StretchBlt(hDCMem, 0, 0 , nWidth, nHeight, hDCMem2, 0, 0,
bm.bmWidth, bm.bmHeight, SRCCOPY);
else if (nType == IMAGE_ICON)
DrawIconEx(hDCMem, 0, 0, (HICON)hBitmap, nWidth, nHeight, 0, 0,
DI_NORMAL);
else if (nType == IMAGE_ENHMETAFILE)
{
RECT rect = {0, 0, nWidth, nHeight};
PlayEnhMetaFile(hDCMem, (HENHMETAFILE)hBitmap, &rect);
}
SelectObject(hDCMem, hBitmapOld);
DeleteDC(hDCMem);
SelectObject(hDCMem2, hBitmapOld2);
DeleteDC(hDCMem2);
if (nType == IMAGE_BITMAP)
DeleteObject(hBitmap);
else if (nType == IMAGE_ICON)
DestroyIcon((HICON)hBitmap);
else if (nType == IMAGE_ENHMETAFILE)
DeleteEnhMetaFile ((HENHMETAFILE)hBitmap);
ReleaseDC(NULL, hDC);
return hBitmapReturn;
}