CreateCompatibleBitmap创建位图的时候总是返回空值

在书上抄写的一段绘制半透明镂空图的代码, 为什么创建兼容位图那条语句总是返回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);
    }
}

CreateCompatibleBitmap创建位图的时候总是返回空
这个说明创建位图失败了