Kendar.org


Go to content

CBitmap & HBITMAP

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;
}

To obtain the image mask (to use transparency)

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;
}


Copyright E.D.R. 2005-2008 | info@kendar.org

Back to content | Back to main menu