gnxiaowei 2020-03-19 09:25 采纳率: 0%
浏览 273

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);
    }
}
  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-03-19 09:45
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥50 QT6.7 Camera预览窗口,camera分辨率设置
  • ¥15 车机是安卓4.4.3,车机没有gps,我想用外置蓝牙gps。所以在用安卓模拟位置服务时候,我下载的相关软件不显示在列表里
  • ¥15 matlab水位控制系统(详解)
  • ¥15 CST软件仿真,已知中心线方程构建图形
  • ¥15 supLink 用户定位
  • ¥15 materials studio中sorption模块得到的吸附量如何计算出绝对吸附量和自由气量
  • ¥15 odoo17生产成品入出库会计日记账设置及自动产生会计分录
  • ¥15 MCU控制20V PWM波输出的控制电路
  • ¥15 关于智能数据系统的问题
  • ¥15 python 打包sdk不成功,如何解决?