DIB 无法在发布模式下呈现

DIBSection not rendering in Release mode

本文关键字:模式 布模式 DIB      更新时间:2023-10-16

我知道当某些东西在调试中工作但在发布中不起作用时,有一些东西没有正确初始化、使用或清理,但我找不到什么。

我首先创建一个这样的 dib 部分:

BITMAPINFO bmi;
HBITMAP bitmap;
LPBYTE pBits;
// Initialize header to 0s.
ZeroMemory(&bmi, sizeof(bmi));
// Fill out the fields you care about.
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = w;
bmi.bmiHeader.biHeight = h;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = BI_RGB;
HDC dc = GetDC(hw); 
bitmap = CreateDIBSection(dc, &bmi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0);
for (int y = 0; y < w*h; y++)
{
    pBits[y * 3 + 0] = 200;
    pBits[y * 3 + 1] = 200;
    pBits[y * 3 + 2] = 200;
}

然后我像这样渲染它:

HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP oldBmp= (HBITMAP)SelectObject(hdcMem, bitmap);
BitBlt(hdc, xabs, yabs, width, height,
    hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, oldBmp);
DeleteDC(hdcMem);

在调试模式下,一切都呈现良好,但在发布模式下,图像是白色的。此外,如果我使用bitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(idb), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);图像会正确呈现。

我已经通过从WM_TIMER和更高WM_PAINT处理程序调用它来测试您的代码,并且我无法重现错误的行为赢得发布版本。测试VS 2013,2008甚至6.0,但仅在Windows 10上。

我看到问题(但它们不会导致构建模式之间的明显差异)。

  • 您可以使用 HDC dc = GetDC(hw); 获取设备上下文,但没有ReleaseDC
  • 我不知道你wwidth的价值.如果 4 位模式不是 24 的倍数,您将有一些视觉故障。

在我的测试代码中,我必须猜测几个值(xabsyabs)。检查是否正确初始化了它们。

void TEST( HWND hwnd )
{
    RECT    rect;
    GetClientRect( hwnd, &rect );
    int width = rect.right;
    int height = rect.bottom;
    if ( width < 1 || height < 1 )
        return;
    // width correction, up to muliple of 4.
    width = ( width + 3 ) & ~3;
    int xabs = 0;
    int yabs = 0;
    BITMAPINFO bmi;
    HBITMAP bitmap;
    LPBYTE pBits;
    // Initialize header to 0s.
    ZeroMemory(&bmi, sizeof(bmi));
    // Fill out the fields you care about.
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = width;
    bmi.bmiHeader.biHeight = height;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 24;
    bmi.bmiHeader.biCompression = BI_RGB;
    HDC hdc = GetDC(hwnd);
    if ( hdc == 0 )
        return;
    bitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0);
    if ( bitmap == 0 )
    {
        ReleaseDC(hwnd,hdc)
        return;
    }
    for (int y = 0; y < width*height; y++)
    {
        // Use more interesting visual.
        pBits[y * 3 + 0] = y/width; //200;
        pBits[y * 3 + 1] = 200;
        pBits[y * 3 + 2] = 200;
    }
    HDC hdcMem = CreateCompatibleDC(hdc);
    if ( hdcMem )
    {
        HBITMAP oldBmp= (HBITMAP)SelectObject(hdcMem, bitmap);
        BitBlt(hdc, xabs, yabs, width, height,
            hdcMem, 0, 0, SRCCOPY);
        SelectObject(hdcMem, oldBmp);
        DeleteObject( bitmap );
        DeleteDC(hdcMem);
    }
    // Release device - missing in oryginal code.
    ReleaseDC(hwnd,hdc);
}