Erstellen HBITMAP aus dem Speicher-Puffer

Ich habe eine Anwendung, die lädt einige blob-Daten aus einer Datenbank darstellen können png-formatierte oder unformatierte binäre Daten für die verschiedenen bitmaps und icons. Dieser wird gespeichert in einem std::vector<unsigned char>

Ich bin mit CImageList Objekte der Darstellung verschiedener Bilder in der Baum-Ansichten, Symbolleiste, Bilder, etc, aber das problem ist das erstellen von bitmaps aus den Daten im Speicher kommen aus verschwommen, als ob es fehlende Pixel, wenn es so etwas wie unten:

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

Arbeiten, um dieses Problem für jetzt bin ich einfach schreiben der Daten() in die Vektor-in eine temporäre Datei und dann mit LoadImage es zu Lesen zurück und erstellen die HBITMAP. Das klappt perfekt, aber das ist freilich schamlos-hack und völlig unnötig, ich würde die Hoffnung.

Ich habe sah rund um online, aber habe nicht gefunden eine wirklich gute Beispiele wie man "richtig" erstellen hbitmaps aus dem Speicher. Ich möchte in der Lage sein zu erstellen, diese bitmaps Hinzugefügt werden, um die image-Liste, ohne jede Datei-i/o und begrenzte Mengen des kopieren der Daten, um, wenn möglich.

Suche nach der beste Weg, dies zu tun, und natürlich windows-spezifische code ist in Ordnung.

UPDATE:

Basierend auf jdv die Antwort, die ich zu spielen begann und mit CreateCompatibleBitmap CreateDIBitmap, und schließlich CreateDIBSection. Alle diese landete schöne schwarze bitmaps anstelle der bisherigen fuzzy-bitmaps, also ich muss etwas falsch wieder, und meine Vermutung ist, da diese bitmap-Erstellung getan wird, in ein Objekt, das hat keine Vorstellung von dem Bildschirm dc oder Fenster, die mit GetDC(NULL) und CreateCompatibleDC(NULL) sind nicht gut. Beispiel-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);

Ich bin jetzt natürlich denken, es hat doch einen einfacheren Weg zu gehen über diese vielleicht durch die Vermeidung der HBITMAP zusammen und arbeiten direkt mit CBitmap Klasse? Wenn es um das hinzufügen des Bildes zum CImageList ich bin mit CBitmap::FromHandle(HBITMAP hbitmap, COLORREF mask) sowieso. Kennt jemand eine einfache Methode zum initialisieren einer CBitmap Objekt aus einem std::vector<unsigned char>?

Bitte nicht Bearbeiten Sie die Frage eine neue Bedeutung, da es untauglich für die Antworten. Fühlen Sie sich frei, um post eine neue Frage und link zu den alten.
Sorry, nur trat einen Schritt zurück und erkannte, dass der einzige Grund, warum ich ging in die GDI-land war, weil ich mit der Methode FromHandle beim hinzufügen zur CImageList ... MFC-CBitmap einfach wraps die GDI-Aufrufe sowieso nicht so, es ist sehr ähnlich.

InformationsquelleAutor AJG85 | 2011-01-04

Schreibe einen Kommentar