我想用BitBlt
把一个颜色值的缓冲区移到一个窗口中,只有窗口显示为空。当我从How can I load a bitmap inside my window?编译并运行代码时(使用我自己的示例.bmp文件),窗口也显示为空。
经过一些测试,问题似乎与SelectObject()
有关。根据文档,当返回值为NULL时,会发生错误:https://learn.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-selectobject。返回值为NULL,但GetLastError()
给出0,表示没有错误。有什么问题吗?
case WM_CREATE:
std::fill(arr, arr + sizeof(arr), RGB(255,0,0));
hBitmap = CreateBitmap(240, 120, 1, sizeof(COLORREF), (void*) arr);
UpdateWindow(hwnd);
break;
case WM_PAINT:
PAINTSTRUCT ps;
BITMAP bitmap;
HGDIOBJ oldBitmap;
HDC hdcMem;
HDC hdc;
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
oldBitmap = SelectObject(hdcMem, hBitmap);
std::cout << (oldBitmap == NULL) << std::endl;
std::cout << GetLastError();
GetObject(hBitmap, sizeof(bitmap), &bitmap);
BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, oldBitmap);
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
break;
(BTW:每次需要hInstance
时,我都使用main()
而不是WinMain()
和GetModuleHandle(NULL)
。由于窗口功能正常,我怀疑它与此无关,但无论如何我都会提到它。)
- 解决了!-
我现在已经让它工作了:)对于其他人看到这一点,这是我所做的改变:
case WM_CREATE:
std::fill(arr, arr + 240 * 120, RGB(255,0,0));
hBitmap = CreateBitmap(240, 120, 1, sizeof(COLORREF) * 8, (void*) arr);
UpdateWindow(hwnd);
break;
2条答案
按热度按时间daolsyd01#
C++类below允许使用
CreateBitmap
函数轻松创建位图。[创建位图的步骤]
1.分配所需尺寸的
ColorU
像素阵列。1.使用
CreateBitmap
函数创建位图。[示例]
在示例中,为了简单起见,省略了错误检查。
vv ColorU vv
mbyulnm02#
如果
arr
是指针,则使用元素总数(240 * 120
)如果
arr
是一个数组,则sizeof
将返回以字节为单位的总大小。相反,使用sizeof(arr)/sizeof(*arr)
来查找数组的计数(数组元素的总数,或像素的总数)。例如,假设arr
的元素是32位,那么您看到的是240 * 120
像素,其中每个像素是4字节或32位。CreateBitmap
的第四个参数需要的是位数大小,所以应该是sizeof(*arr) * 8
或32。请注意,这将产生一个蓝色位图,而不是红色,因为它使用的是BGR格式而不是RGB。
看来你已经知道如何使用内存dc了。你可以用
CreateCompatibleBitmap
创建一个位图,然后选择这个位图到内存dc中,然后使用标准的GDI函数,比如FillRect
。这将避免计数位和字节的陷阱。