C++ 如何使用Windows API在窗口中显示位图(带有颜色值的数组)?

C++ 如何使用Windows API在窗口中显示位图(带有颜色值的数组)?,c++,winapi,drawing,C++,Winapi,Drawing,我想使用BitBlt将颜色值缓冲区移动到窗口,只有窗口显示为空。当我从编译和运行代码时(使用我自己的示例.bmp文件),窗口也显示为空 经过一些测试后,问题似乎出在SelectObject()上。根据文档,当返回值为NULL时,发生了一个错误:。返回值为NULL,但GetLastError()给出0,表示没有错误。这里有什么问题 case WM\u创建: 标准:填充(arr,arr+sizeof(arr),RGB(255,0,0)); hBitmap=CreateBitmap(240、120、1

我想使用
BitBlt
将颜色值缓冲区移动到窗口,只有窗口显示为空。当我从编译和运行代码时(使用我自己的示例.bmp文件),窗口也显示为空

经过一些测试后,问题似乎出在
SelectObject()
上。根据文档,当返回值为NULL时,发生了一个错误:。返回值为NULL,但
GetLastError()
给出0,表示没有错误。这里有什么问题

case WM\u创建:
标准:填充(arr,arr+sizeof(arr),RGB(255,0,0));
hBitmap=CreateBitmap(240、120、1、sizeof(COLORREF),(void*)arr);
更新窗口(hwnd);
打破
案例WM_油漆:
PAINTSTRUCT-ps;
位图;
hgdobj;
HDC-hdcMem;
HDC-HDC;
hdc=开始喷漆(hwnd和ps);
hdcMem=CreateCompatibleDC(hdc);
oldBitmap=SelectObject(hdcMem、hBitmap);

std::cout如果
arr
是指针,则使用元素总数(
240*120

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

CreateBitmap
的第4个参数需要以位为单位的大小,因此它应该是
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功能,如。这将避免计算位和字节的陷阱。

空窗口的颜色是什么?白色,与我有空窗口时的颜色相同。
std::fill(arr,arr+sizeof(arr),RGB(255,0,0))不正确,
sizeof(COLORREF)
也无效,因为它应该是位深度
SelectObject()
返回要替换的对象,该对象可能为空。GDI不使用
GetLastError()
报告错误。因此,无法区分返回的空对象和实际错误。但是,可能发生的唯一错误是,如果您传入了一个无效的
HDC
以选择进入。您没有检查
BeginPaint()
CreateCompatibleDC()
的返回值以查找错误谢谢,我是Windows API的新手,所以我不知道:)(顺便说一句:
sizeof(arr)
错误真是太愚蠢了,我以前用
sizeof()
fill()
工作过很多次。)非常感谢您,我现在可以使用了:)这个
sizeof(arr)
错误有点愚蠢,我以前使用过
fill()
sizeof()
很多次,但是
CreateBitmap()
使用的是位,而不是我不知道、也从来没有想到的字节:)