Cómo convertir una matriz de píxeles a HBITMAP

Tengo una matriz de píxeles que necesito convertir a HBITMAP para mostrarla en una ventana. Intenté usar CreateDIBitmap () pero no tengo los encabezados BMP. Intenté construirlos manualmente de acuerdo con la documentación de MSDN, pero esto no funcionó.

Aquí cómo se ve mi código

HBITMAP hBitmap
char pixels[160*120]; // White grayscale image of size 160x120
memset(pixels,255,sizeof(pixels));

BITMAPINFOHEADER bmih;
bmih.biSize     = sizeof(BITMAPINFOHEADER);
bmih.biWidth    = 160;
bmih.biHeight   = -120;
bmih.biPlanes   = 1;
bmih.biBitCount = 8;
bmih.biCompression  = BI_RGB ;
bmih.biSizeImage    = 0;
bmih.biXPelsPerMeter    =   10;
bmih.biYPelsPerMeter    =   10;
bmih.biClrUsed  =0;
bmih.biClrImportant =0;

BITMAPINFO dbmi;
dbmi.bmiHeader = bmih;
dbmi.bmiColors->rgbBlue = 0;
dbmi.bmiColors->rgbGreen = 0;
dbmi.bmiColors->rgbRed = 0;
dbmi.bmiColors->rgbReserved = 0;
void* bits = (void*)&(pixels[0]); 
hBitmap = CreateDIBitmap(localDC, &bmih, CBM_INIT, qB.bmBits, &dbmi, DIB_RGB_COLORS);

Ahora obtengo un hBitmap que no es NULL, lo cual es bueno, pero siempre muestra una imagen negra como si no apuntara a la matriz de píxeles. Lo comprobé utilizando el código.

BITMAP qB;
GetObject(reinterpret_cast<HGDIOBJ>(hBitmap),sizeof(BITMAP),reinterpret_cast<LPVOID>(&qB));

Y de hecho qB.bmBits es NULL. ¿Cuál es el problema y cómo solucionarlo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta