Bitmaps: Versuch "SetDIBits(..)" durch "SetDIBitsToDevice(..)" zu ersetzen ergibt nur schwarze Grafik



  • Hallo zusammen,

    ich muss doch wieder eine Frage zu den Bitmaps stellen.
    Habe herausgefunden, dass für mein Panel die "SetDIBitsToDevice(..)" Funktion
    übersetzt wird, während es die "SetDIBits(..)" leider nicht gibt.

    Nun habe ich einen Quellcode mit "SetDIBits(..)", der auf dem PC funktioniert.
    Nun will ich ein Mapping meiner Parameter auf die "SetDIBitsToDevice(..)" schreiben.
    Leider bekomme ich damit nur schwarze Bilder.

    Ich habe schon dutzende Beispiele und Erklärungen, die auch auf WORD-Alignment und DWORD-Alignment
    eingehen durchgestöbert. Aber ich komme nicht auf den Fehler.

    Meine Bittiefe ist 32 Bit, meine Daten entsprechen einem "RGBQUAD", also korrektes DWORD-Alignment.
    Der alte Aufruf von "SetDIBits(..)" ist wie folgt eingebettet und funktioniert.

    // set the bits
    HDC hdc = GetDC(NULL);
    HBITMAP hbmSrc = ::CreateCompatibleBitmap(hdc, sizeDest.cx, sizeDest.cy);
    
    if (hbmSrc)
    {
    	BITMAPINFO bi;
            BITMAP bm;
            bm = PrepareBitmapInfo32(bi, hbmSrc);
    	if (bm.bmHeight > 0)
    	{
    		if (SetDIBits(hdc, hbmSrc, 0, sizeDest.cy, pDestPixels, &bi, DIB_RGB_COLORS))
    		{
    			// delete the bitmap and attach new
    			DeleteObject();
    			bRes = Attach(hbmSrc);
    		}
    	}
    
    	::ReleaseDC(NULL, hdc);
    
    	if (!bRes)
    		::DeleteObject(hbmSrc);
    }
    

    Zur Verdeutlichung des Mappings habe ich die "SetDIBits2(..)" geschrieben,
    (mit identischer Signatur) die die "SetDIBits(..)" ersetzen soll.

    int CEnBitmap::SetDIBits2( HDC hdc, HBITMAP hbm, UINT start, UINT cLines, CONST VOID* lpBits, CONST BITMAPINFO* lpBmi, UINT ColorUse )
    {
    	return SetDIBitsToDevice(hdc, 0, 0, lpBmi->bmiHeader.biWidth, lpBmi->bmiHeader.biHeight, 0, 0, 0, cLines, lpBits, lpBmi, DIB_RGB_COLORS);
    }
    

    Was geht schief?
    Kann mir bitte jemand helfen!

    Grüsse
    Helmut



  • Nach vielen Stunden Fragezeichen im Kopf, bin ich einen Schritt weiter gekommen.
    Die Grafik wird doch angezeigt aber leider nicht an der Stelle, an der sie sein soll.

    Eigentlich sollte diese Bitmap an die Toolbar gebunden sein.
    Das geht auch mit der ursprünglichen "SetDIBits(..)" Funktion.

    Zufällig habe ich mein Anwendungsfenster verkleinert und dann auf einen
    der Buttons geklickt, und plötzlich erchien im oberen linken Eck das Toolbar
    Bitmap.

    --> Ja, ich habe die Koordinaten mit "0, 0" angegeben.
    Aber die Dinger kommen ja eigentlich in eine BitmapListe.

    Also: kann ich dann diese Funktion doch nicht verwenden?
    Oder gibt es trotzdem noch eine Möglichkeit?

    Grüsse
    Helmut



  • Hallo zusammen,

    immerhin kann ich diese Frage jetzt auch wieder selbst beantworten.
    Habe zum Glück einen Artikel von der Uni Chemnitz gefunden.
    Wenn ich den über Weihnachten noch studiere, gibts vielleicht auch ein Chance
    für mich, die Hintergründe zu verstehen:

    https://www-user.tu-chemnitz.de/~ygu/petzold/ch15d.htm

    Gemäss den Beispielen habe ich meinen Ersatz für "SetDIBits(..)" wie folgt geschrieben:

    int CEnBitmap::SetDIBits2( HDC hdc, HBITMAP hbm, UINT start, UINT cLines, CONST VOID* lpBits, CONST BITMAPINFO* lpBmi, UINT ColorUse )
    {
        HDC     hdcMem;
        hdcMem = CreateCompatibleDC (hdc) ;
        SelectObject (hdcMem, hbm) ;
    
    	cLines = SetDIBitsToDevice(hdcMem, 0, 0, lpBmi->bmiHeader.biWidth, lpBmi->bmiHeader.biHeight, 0, 0, 0, cLines, lpBits, lpBmi, ColorUse);
    
        DeleteDC(hdcMem);
        return cLines;
    }
    

    Jedenfalls läufte auf dem PC und für mein Panel mit Windows CE 6.0 kann
    ich es schon mal übersetzen.

    ... und wie es auch anders sein sollte...
    Auf dem Panel stürzt es ab! Und zwar bei:

    "VERIFY(bm.Attach(::LoadImage(
    ::AfxFindResourceHandle(MAKEINTRESOURCE(inBitmapID), RT_BITMAP),
    MAKEINTRESOURCE(inBitmapID), IMAGE_BITMAP, 0, 0,
    (LR_DEFAULTSIZE | LR_CREATEDIBSECTION))));"

    Vielleicht hilft es ja noch jemandem.

    Grüsse und frohe Weihnachten
    Helmut



  • Hallo zusammen,

    hier noch ein kleiner Nachtrag von mir, der Vollständigkeit halber.

    Nachdem sich am Panel nun irgend ein LoadImage nicht ausführen lässt,
    hab ich einfach mal die 24Bit Grafiken so in die Panel-Anwendung
    geingesteckt.

    Und siehe da...
    Zumimndest mein WinCE 6.0 kann 24 Bit Bitmap images in der Toolbar
    standardmässig verarbeiten. Dabei bastelt sich das System auch selbstständig
    die ausgegrauten bmp´s für die "inaktiv"-Anzeige.

    Also weiter zum nächsten Problem...


Log in to reply