Main menu:
Development > MCF/C++
One day, i needed to accomply a weird(?) operation: modify a bitmap "in memory" and create a copy for my purposes, e.g. resizing it..
HBITMAP ResizeBmp(HWND hWnd,HBITMAP hBmp,int cx,int cy)
{
HDC dc =GetDC(hWnd);
HDC copyDC = CreateCompatibleDC(dc);
HDC srcDC = CreateCompatibleDC(dc);
int oriCx,oriCy;
//Get Original Size
BITMAP bm;
GetObject(hBmp, sizeof(bm),&bm);
oriCx = bm.bmWidth;
oriCy = bm.bmHeight;
RECT bmpRect;
bmpRect.top=0;
bmpRect.left=0;
bmpRect.right=cx;
bmpRect.bottom=cy;
RECT oriRect = bmpRect;
oriRect.right=oriCx;
oriRect.bottom=oriCy;
HRGN rgn1 = CreateRectRgnIndirect( &bmpRect );
HRGN rgn2 = CreateRectRgnIndirect( &oriRect );
SelectClipRgn(copyDC,rgn1);
SelectClipRgn(srcDC,rgn2);
DeleteObject(rgn1);
DeleteObject(rgn2);
HBITMAP copyBMP = CreateCompatibleBitmap(dc,cx,cy);
HBITMAP copyBMPold = (HBITMAP)SelectObject(copyDC,copyBMP);
HBITMAP srcBMPold = (HBITMAP)SelectObject(srcDC,hBmp);
if(oriCx!=cx || oriCy!=cy)
StretchBlt(copyDC,0,0,cx,cy,srcDC,0,0,oriCx,oriCy,SRCCOPY);
else
BitBlt(copyDC,0,0,cx,cy,srcDC,0,0,SRCCOPY);
copyBMP = (HBITMAP)SelectObject(copyDC, copyBMPold);
DeleteDC(copyDC);
DeleteDC(srcDC);
return copyBMP;
}
HBITMAP ResizeBmpMask(HWND hWnd,HBITMAP hBmp,int cx,int cy,COLORREF clColor)
{
HDC dc =GetDC(hWnd);
HDC copyDC = CreateCompatibleDC(dc);
HDC srcDC = CreateCompatibleDC(dc);
HDC maskDC = CreateCompatibleDC(dc);
int oriCx,oriCy;
//Get Original Size
BITMAP bm;
GetObject(hBmp, sizeof(bm),&bm);
oriCx = bm.bmWidth;
oriCy = bm.bmHeight;
RECT bmpRect;
bmpRect.top=0;
bmpRect.left=0;
bmpRect.right=cx;
bmpRect.bottom=cy;
RECT oriRect = bmpRect;
oriRect.right=oriCx;
oriRect.bottom=oriCy;
HBITMAP maskBmp = GetBmpMask(hWnd,hBmp,cx,cy);
HBITMAP sizedBmp = ResizeBmp(hWnd,hBmp,cx,cy);
HRGN rgn1 = CreateRectRgnIndirect( &bmpRect );
HRGN rgn2 = CreateRectRgnIndirect( &bmpRect );
HRGN rgn3 = CreateRectRgnIndirect( &bmpRect );
SelectClipRgn(copyDC,rgn1);
SelectClipRgn(srcDC,rgn2);
SelectClipRgn(maskDC,rgn3);
DeleteObject(rgn1);
DeleteObject(rgn2);
DeleteObject(rgn3);
HBITMAP copyBMP = CreateCompatibleBitmap(dc,cx,cy);
HBITMAP copyBMPold = (HBITMAP)SelectObject(copyDC,copyBMP);
HBITMAP srcBMPold = (HBITMAP)SelectObject(srcDC,sizedBmp);
HBITMAP maskBMPold = (HBITMAP)SelectObject(maskDC,maskBmp);
FillRect(copyDC,&oriRect,CreateSolidBrush(clColor));
COLORREF clTransparent = GetPixel(srcDC,0,0);
TransparentBlt(copyDC,0,0,cx,cy,srcDC,0,0,cx,cy,(UINT)clTransparent);
copyBMP = (HBITMAP)SelectObject(copyDC, copyBMPold);
DeleteDC(copyDC);
DeleteDC(srcDC);
return copyBMP;
}