Problem mit Bitmapanzeige



  • Ich bins mal wieder. Ich möchte ein Bitmap aus Bilddaten erstellen, die ich von einer Kamera bekomme (mit myCam.grabPicture()). Das funktioniert auch soweit gut.

    Aber wenn ich SelectObject() aufrufe bricht mein Programm ab und ich habe keine Ahnung warum.

    HDC hdcbitmap = CreateCompatibleDC (NULL);
    HBITMAP bmToShow, hbmOld;
    HDC hdc;
    PAINTSTRUCT ps;
    
    hdc = BeginPaint (hwnd, &ps);
    
    int* pictureData;
    myCam.grabPicture(&pictureData);
    
    bmToShow = CreateBitmap(640, 480, 1, 16, pictureData);
    
    hbmOld = (HBITMAP) SelectObject (hdcbitmap, bmToShow);
    
    if(hbmOld == NULL)
    	errorOut("SelectObject fehlgeschlagen.", 0); // <----- An dieser Stelle schmiert der Code ab
    
    BitBlt (hdc, 0, 0, 640, 480, hdcbitmap,0,0, SRCCOPY);
    
    EndPaint (hwnd, &ps);
    

    Wo liegt das Problem in meinem Code? Das Bitmap wird ja fehlerfrei erstellt (Habe meine Fehlerabfragen nur der Übersichtlichkeit halber rausgenommen.)



  • Hmmm... ich würde mal sagen, dass die Doku hier etwas missverständlich ist...
    Das "SelectObject" liefert ja das letzte selektierte Objekt dieser Art zurück. Und wenn eben davor keines Selectiert war, dann liefert er "NULL" zurück... somit brauchst Du eigentlich den Rückgabewerk nicht prüfen 😕



  • WindowsAPI schrieb:

    NULL indicates that an error occurred and the selected object is not a region.

    Also NULL bedeutet meines Erachtens immer einen Fehler. Nichtsdestotrotz wird das Bild ja nicht angezeigt, dass ich mit BitBlt() an den DC meines Fensters schaufle.

    Ich weiß echt nicht mehr weiter...



  • Ich stehe gerade auf der Leitung... sorry...
    Das Problem ist natürlich, dass Du ein Bitmap mit 16 Farben erstellst und vertmutlich Dein DC mehr Farben hat...
    Du solltest "CreateCompatibleBitmap" und Get/SetDIBits um ein passendes Bitmap zum DC zu erstellen...



  • In den Display-Gerätekontext kann überhaupt keine Bitmap selektiert werden:

    Bitmaps can be selected for memory DCs only



  • Ich bitte, meinen vorherigen Beitrag gnädig zu übersehen - so wie ich übersah, dass die Bitmap in der Tat in einen Memory-DC selektiert wurde.



  • Für die Bildschirmausgabe von geräteunabhängigen Bitmaps empfehle ich übrigens die DrawDib-Api:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_drawdib.asp


Log in to reply