Re: StretchBlt()
Could have something to do with the fact MS Paint doesn't
stretch the entire image - only the displayed part...
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@mvps.org
MVP VC FAQ: http://vcfaq.mvps.org
=====================================
"William" <port@mx15.freecom.ne.jp> wrote in message
news:%23$HpZygcHHA.3616@TK2MSFTNGP05.phx.gbl...
Env: WindowsXP, VC++6.0
My app need to deal with large DIB bitmap(256color, cx=4000, cy=4000) with
scale(x8) and mask display function.
I did as follows,
hdcImage = CreateCompatibleDC(hdcParent);
hbmImage = Create256DIBitmap(hdcParent, cxImage, cyImage, FALSE );
SelectObject(hdcImage, hbmImage);
hdcMask = CreateCompatibleDC(hdcImage);
hbmMask = Create256DIBitmap(hdcParent, cxImage, cyImage, TRUE);
SelectObject(hdcMask, hbmMask);
hdcShow = CreateCompatibleDC(hdcImage);
hbmShow = CreateCompatibleBitmap(hdcImage, cxScale, cyScale);
SelectObject(hdcShow, hbmShow);
To show the image, we call the following function
void CDIBView::OnDrawScaleImage(CDC* pDC)
{
BYTE MaskByte = 0x00~0xFF;
memset(pvBitsMask, MaskByte, nSizeOfColorBitMask);
BitBlt( hdcMask, 0, 0, cxShow, cyImage, hdcImage, cxImage, 0, SRCAND);
StretchBlt( hdcShow, 0, 0, cxScale, cyScale, hdcMask, 0, 0, cxShow,
cyImage, SRCCOPY);
// Copy the bits to the screen.
BitBlt(pDC->m_hDC, 0, 0, cxScale, cyScale, hdcShow, 0, 0, SRCCOPY);
}
I find that StretchBlt() will use quite a lot of system memory when
cxScale=cxImage*8, cyScale=cyImage*8.
On the other hand, if I edit the same bitmap(256color, cx=cy=1000) under
MSPaint.exe, I can't find obvious increase of memory usage when I change
the scale from x1 to x8.
So, my problem is why does StretchBlt() use so many system memory even
after calling it?
And how should I work it around?
TIA
William