【问题标题】:DIBSection not rendering in Release modeDIBSection 不在发布模式下呈现
【发布时间】:2018-04-07 16:19:05
【问题描述】:

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

我首先像这样创建一个 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);,图像会正确呈现。

【问题讨论】:

  • 改进您的错误检查,以便您准确地知道哪个函数失败了。
  • 寻求调试帮助的问题必须包括所需的行为在问题本身中重现它所需的最短代码。请阅读如何创建minimal reproducible example

标签: c++ winapi gdi


【解决方案1】:

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

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

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

在我的测试代码中,我不得不猜测几个值(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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2014-09-07
    • 2019-01-26
    相关资源
    最近更新 更多