DIB 无法在发布模式下呈现
DIBSection not rendering in Release mode
我知道当某些东西在调试中工作但在发布中不起作用时,有一些东西没有正确初始化、使用或清理,但我找不到什么。
我首先创建一个这样的 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
。 - 我不知道你
w
或width
的价值.如果 4 位模式不是 24 的倍数,您将有一些视觉故障。
在我的测试代码中,我必须猜测几个值(xabs
,yabs
)。检查是否正确初始化了它们。
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);
}
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 使用可变模板的Broadcaster/Listener模式
- c++方法参数只能在linux的发布模式下自行更改
- 资源管理设计模式
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 小字符串优化(调试与发布模式)
- 多对多请求/结果模式的模式
- 正则表达式用模式替换模式
- QRegExp :搜索不包含其他模式的模式
- 设计模式(GoF模式)在c++中的实现
- 如何对某个十进制模式进行模式匹配
- 将 valijson 与 Nlohmann 的 JSON for Modern C++ 结合使用,以验证具有子模式的模式
- 消息系统的观察者模式+访问者模式