在书上抄写的一段绘制半透明镂空图的代码, 为什么创建兼容位图那条语句总是返回NULL,导致替换位图之后返回空,从而引发了引发了异常: 读取访问权限冲突。
pxbk 是 0xD16FE9FA。 nBackRGB_B的值是-858154840,这是不正常的值, 到底错在哪里了呢?
void Sprite::DrawTransAlpha(HDC hdcBack, int nXBack, int nYBack, int nWidthBack,
int nHeightBack, int nXFore, int nYFore, int nAlpha, COLORREF crTrans)
{
if (m_hbm != NULL)
{
HDC hdcMem = CreateCompatibleDC(hdcBack);
RECT rBackRect = { nXBack,nYBack,nWidthBack,nHeightBack };
HBITMAP hbmTmp = CreateCompatibleBitmap(hdcBack, nWidthBack, nHeightBack);
HBITMAP hbmBk = (HBITMAP)SelectObject(hdcBack, hbmTmp);
RECT rForeRect = { nXFore,nYFore,nXFore + m_nWidth,nYFore + m_nHeight };
RECT rTransRect, rTransRect2;
if (IntersectRect(&rTransRect, &rBackRect, &rForeRect))
{
BITMAP bm, bmbk;
GetObject(m_hbm, sizeof(BITMAP), &bm);
BYTE* px = new unsigned char[bm.bmHeight * bm.bmWidthBytes];
GetBitmapBits(m_hbm, bm.bmHeight * bm.bmWidthBytes, px);
GetObject(hbmBk, sizeof(BITMAP), &bmbk);
BYTE* pxbk = new unsigned char[bmbk.bmHeight * bmbk.bmWidthBytes];
GetBitmapBits(hbmBk, bmbk.bmHeight * bmbk.bmWidthBytes, pxbk);
rTransRect2 = rTransRect;
OffsetRect(&rTransRect2, -rForeRect.left, -rForeRect.top);
int pb = bm.bmBitsPixel / 8;
int pbbk = bmbk.bmBitsPixel / 8;
int dx1, dx2, dy1, dy2;
for(dy1 = rTransRect.top, dy2 = rTransRect2.top; dy1 < rTransRect.bottom; dy1++, dy2++)
{
for (dx1 = rTransRect.left, dx2 = rTransRect2.left; dx1 < rTransRect.right; dx1++, dx2++)
{
int nBackRGB_B = dy1 * bmbk.bmWidthBytes + dx1 * pbbk;
int nForeRGB_B = dy2 * bm.bmWidthBytes + dx2 * pb;
if (RGB(px[nForeRGB_B + 2], px[nForeRGB_B + 1], px[nForeRGB_B]) != crTrans)
{
pxbk[nBackRGB_B] = px[nForeRGB_B] * nAlpha + pxbk[nBackRGB_B] * (255 - nAlpha) / 255;
pxbk[nBackRGB_B+1] = px[nForeRGB_B+1] * nAlpha + pxbk[nBackRGB_B+1] * (255 - nAlpha) / 255;
pxbk[nBackRGB_B+2] = px[nForeRGB_B+2] * nAlpha + pxbk[nBackRGB_B+2] * (255 - nAlpha) / 255;
}
}
}
SetBitmapBits(hbmTmp, bmbk.bmWidthBytes * bmbk.bmHeight, pxbk);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hbmTmp);
BitBlt(hdcBack, 0, 0, rBackRect.right, rBackRect.bottom, hdcMem, 0, 0, SRCCOPY);
delete[]px;
delete[]pxbk;
SelectObject(hdcMem, hbmOld);
}
DeleteObject(hbmTmp);
DeleteDC(hdcMem);
}
}