Bitmap auf Desktop zeichnen

Kaiser206

Erfahrenes Mitglied
Hallo,
ich will auf dem Desktop ein Bitmap zeichnen.

Das Problem ist jetzt, das ich nur die bitmap im Sinne des Wortes habe:
Code:
BYTE* bmp;
Also wirklich nur die map!
Den Header kann ich neu generieren, da ich die Parameter bereits weis.
Mein Code sieht bis jetzt so aus:

Code:
#include <iostream>
using namespace std;

//Hier habe ich ein 100x200 24bit BMP verwendet

void drawBMP(BYTE* bmp)
{
        HWND    hWnd    = GetDesktopWindow();
        HDC     hdc     = GetDC(hWnd);
        HBITMAP hbm     = CreateCompatibleBitmap(hdc, 100, 200);

        BITMAPINFO bmi;
        memset(&bmi, '\0', sizeof(bmi));
        bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
        bmi.bmiHeader.biWidth        = 100;
        bmi.bmiHeader.biHeight       = 200;
        bmi.bmiHeader.biBitCount     = 24;
        bmi.bmiHeader.biPlanes       = 1;
        bmi.bmiHeader.biCompression  = BI_RGB;
        bmi.bmiHeader.biSizeImage    = 24 * 100 * 200 / 8;

        cout << SetDIBits( hdc,
                   hbm,
                   0,
                   bmi.bmiHeader.biHeight,
                   bmp,
                   &bmi,
                   DIB_RGB_COLORS );
                   
        ReleaseDC(hWnd,hdc);
        DeleteObject(hbm);

}

Die Ausgabe ist 200, also müsste es doch geklappt haben.
Die übergebenen daten sind richtig, denn der Bitmap lässt sich pixelweise damit zeichen, was aber leider zu langsam ist.

Ich habe so das Gefühl das alles grundlegend falsch ist... :rolleyes:

Bitte um Hilfe!
 
Hab jetzt einen weiteren Ansatz:

Code:
void drawBMP(BYTE* bmp)
{
        HWND    hWnd    = GetDesktopWindow();
        HDC     hdc     = GetDC(hWnd);
        HDC     memDC   = CreateCompatibleDC(hdc);
        HBITMAP hbm     = CreateCompatibleBitmap(hdc, 100, 200);
        HBITMAP hbmOld  = (HBITMAP)SelectObject(memDC, hbm);

        BITMAPINFO bmi;
        memset(&bmi, '\0', sizeof(bmi));
        bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
        bmi.bmiHeader.biWidth        = 100;
        bmi.bmiHeader.biHeight       = 200;
        bmi.bmiHeader.biBitCount     = 24;
        bmi.bmiHeader.biPlanes       = 1;
        bmi.bmiHeader.biCompression  = BI_RGB;
        bmi.bmiHeader.biSizeImage    = bmi.bmiHeader.biBitCount * 100 * 200 / 8;

        SetDIBits( memDC,
                       hbm,
                       0,
                       bmi.bmiHeader.biHeight,
                       bmp,
                       &bmi,
                       DIB_RGB_COLORS );

        BitBlt(hdc, 0, 0, 100, 200, memDC, 0, 0, SRCCOPY);

        SelectObject(memDC, hbmOld);
        DeleteDC(memDC);
        ReleaseDC(hWnd,hdc);
        DeleteObject(hbm);
}

Das scheint mir mehr sinn zu ergeben. Funktioniert aber genauso wenig. Irgendwie blicke ich da nicht durch!:mad:
 
Ok es geht jetzt einigermaßen:

Code:
void drawBMP(BYTE* bmp, int nBit, int width, int height)
{
       HBITMAP hbm       = CreateCompatibleBitmap(hdc, width, height);
        HDC hdcBitmap     = CreateCompatibleDC( hdc );
        HBITMAP hbmOld    = (HBITMAP)SelectObject( hdcBitmap, hbm );
        BITMAPINFO bmi;
        memset(&bmi, '\0', sizeof(bmi));
        bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
        bmi.bmiHeader.biWidth        = width;
        bmi.bmiHeader.biHeight       = height;
        bmi.bmiHeader.biBitCount     = nBit;
        bmi.bmiHeader.biPlanes       = 1;
        bmi.bmiHeader.biCompression  = BI_RGB;
        bmi.bmiHeader.biSizeImage    = bmi.bmiHeader.biBitCount * width * height / 8;
        if (nBit == 1) {
                bmi.bmiHeader.biSizeImage    = (bmi.bmiHeader.biBitCount+1) * width * height / 8;
        } else {
                bmi.bmiHeader.biSizeImage    = bmi.bmiHeader.biBitCount * width * height / 8;
        }
        SetDIBits( hdcBitmap,
                   hbm,
                   0,
                   bmi.bmiHeader.biHeight,
                   bmp,
                   &bmi,
                   DIB_RGB_COLORS );
        BitBlt(hdc, 0, 0, width, height, hdcBitmap, 0, 0, SRCCOPY);
        DeleteObject(hbm);
        SelectObject( hdcBitmap, hbmOld );
        DeleteDC( hdcBitmap );
}
 
Zurück