gpt4 book ai didi

c++ - 如何使用 Window API 在窗口中显示位图(具有颜色值的数组)?

转载 作者:行者123 更新时间:2023-11-30 03:16:34 25 4
gpt4 key购买 nike

我想使用 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;

(顺便说一句:每次我需要 时,我都使用 main() 而不是 WinMain()GetModuleHandle(NULL) hInstance。由于窗口功能正常,我怀疑它与此无关,但我还是会提到它。)

---已解决!---

我现在已经开始工作了 :) 对于其他人来说,这就是我所做的更改:

    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;

最佳答案

如果arr是一个指针,使用元素的总数(240 * 120)

如果arr 是一个数组,sizeof 将返回以字节为单位的总大小。而是使用 sizeof(arr)/sizeof(*arr) 来查找数组的计数(数组元素的总数,或像素总数)。例如,假设 arr 的元素是 32 位,那么您正在查看 240 * 120 像素,其中每个像素为 4 字节或 32 位。

CreateBitmap 的第四个参数需要以位为单位的大小,因此它应该是 sizeof(*arr) * 8 或只是 32。

uint32_t arr[240 * 120];
std::fill(arr, arr + sizeof(arr)/sizeof(*arr), RGB(255, 0, 0));
//or std::fill(arr, arr + 240 * 120, RGB(255, 0, 0));
hBitmap = CreateBitmap(240, 120, 1, 32, (void*)arr);

请注意,这将生成蓝色位图,而不是红色位图,因为它使用的是 BGR 格式而不是 RGB。

看来您已经知道如何使用内存 dc。您可以使用 CreateCompatibleBitmap 创建一个位图,然后将该位图选择到内存 dc 中,并使用标准 GDI 函数,例如 FillRect .这将避免计算位和字节的陷阱。

关于c++ - 如何使用 Window API 在窗口中显示位图(具有颜色值的数组)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56226748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com