Création de HBITMAP à partir d'un tampon de mémoire

J'ai une application qui charge des données blob d'une base de données qui peut représenter png formaté ou des données binaires brutes pour diverses images et des icônes. Ce sont stockées dans un std::vector<unsigned char>

Je suis en utilisant CImageList objets d'afficher plusieurs images dans l'arborescence de la vue, de la barre d'outils des images, etc, mais le problème est de créer des images bitmap à partir des données de la mémoire sont à venir floue, comme si il manque des pixels lorsque vous faites quelque chose comme ci-dessous:

std::vector<unsigned char> bits;
HBITMAP hbitmap = CreateBitmap(16, 16, 1, 32, bits.data());

Pour contourner ce problème pour l'instant, j'ai simplement écrit les données() dans le vecteur d'un fichier temporaire, puis à l'aide de LoadImage de le lire et de la création de la HBITMAP. Cela fonctionne parfaitement mais c'est vrai, sans vergogne hack et devrait être complètement inutile, j'espère.

J'ai regardé en ligne, mais n'ai pas trouvé de vraiment de bons exemples de la manière dont "correctement" créer hbitmaps de la mémoire. Je voudrais être en mesure de créer ces images à ajouter à la liste d'images sans aucun fichier i/o et des quantités limitées de copier les données si possible.

La recherche de la meilleure façon de le faire et, évidemment, windows code spécifique est fine.

Mise à JOUR:

Basé sur jdv réponse que j'ai commencé à jouer avec CreateCompatibleBitmap CreateDIBitmap, et enfin CreateDIBSection. Tous ces fini la création de beaux noir bitmaps au lieu de la précédente floue images pour que je doit faire quelque chose de nouveau mal et ma conjecture est que depuis cette bitmap création est fait dans un objet qui n'a aucune notion de l'écran dc ou la fenêtre à l'aide de GetDC(NULL) et CreateCompatibleDC(NULL) ne sont pas bons. Exemple de code:

    BITMAPINFO bmi;
    ZeroMemory(&bmi, sizeof(BITMAPINFO));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biHeight = 16;
    bmi.bmiHeader.biWidth = 16;
    bmi.bmiHeader.biPlanes = 1;

    HDC dc = CreateCompatibleDC(NULL);
    HBITMAP hbitmap = CreateDIBSection(dc, &bmi, DIB_RGB_COLORS, (void**)blobData.GetMember<FILEDATAFIELD_DATA>().data(), NULL, 0);

Je suis maintenant, bien sûr, en pensant qu'il y a obtenu d'être un moyen plus simple pour aller à ce sujet peut-être en évitant les HBITMAP ensemble et de travailler directement avec les CBitmap classe? Quand il s'agit de l'ajout de l'image de la CImageList je suis en utilisant CBitmap::FromHandle(HBITMAP hbitmap, COLORREF mask) de toute façon. Quelqu'un sait-il un moyen simple pour initialiser un CBitmap objet à partir d'une std::vector<unsigned char>?

source d'informationauteur AJG85