Problem mit CreateCompatibleBitmap und SetPixel



  • Hallo!

    Ich möchte mit Hilfe der GDI-Funktionen ein leeres Bild im Hauptspeicher erstellen, auf das ich dann mit SetPixel und GetPixel zugreifen kann.

    Ich habe mir das folgendermaßen gedacht:

    HDC dc = CreateCompatibleDC(NULL);
    
    HBITMAP bitmap = CreateCompatibleBitmap(dc,100,200);
    
    SelectObject(dc,bitmap);
    
    int wert = SetPixel(dc,10,10,1);
    wert = GetPixel(dc,10,10);
    
    //Speicher freigeben
    DeleteDC(dc);
    DeleteObject(bitmap);
    

    Leider funktioniert es nicht.

    Wenn ich mit dem Debugger da reingehe, liefert SetPixel nicht (wie es sein sollte) den gesetzten Wert 1, sondern 0. Im Fehlerfall sollte SetPixel jedoch -1 liefern. Auch die Funktion GetPixel liest wieder eine 0 aus.

    Die Variablen dc und bitmap werden mit vernünftigen Werten belegt, also liefern keine Fehler.

    Wenn ich nun statt des Erzeugens eines leeren Bildes mit CreateCompatibleBitmap eins mit LoadImage lade, funktionieren die Funktionen SetPixel und GetPixel korrekt.

    Ich habe nun keinen blassen Schimmer, woran das liegen könnte. 😞

    Aber vielleicht kann mir jemand einen Tipp geben.

    Danke



  • Gibt mal hier keinen Speicherkontext, sondern einen Gerätekontext an:

    HBITMAP bitmap = CreateCompatibleBitmap([u]dc[/u],100,200);
    

    PS: Du hast vergessen die vorherige Bitmap wieder in den HDC zu selektieren. Siehe MSDN-Infos zu SelectObject.



  • Aber wird dann das Bitmap nicht in den Grafikspeicher geschrieben? Ich will das Bitmap ja nicht anzeigen, sondern nur modifizieren.

    Wie bekomme ich denn einen Gerätekontext? GetDC(hwnd) wird schwierig, denn das ganze ist nur eine Konsolenanwendung, so dass ich keinen hwnd habe, oder?


  • Mod

    CreateDC! GetDC(NULL) geht immer! Auch in Consolen Anwendungen!

    Außerdem gibt es doch Funktionen wie GetBitmapBits SetBitmapBits! Du brauchst dann keinen DC. Dito gibt es DIBs etc...



  • Danke für die Antworten!

    Habe das Problem aber anders lösen können.

    Und zwar funktioniert das ganze komischerweise mit CreateBitmap.
    Da muss ich zwar die Farbeebenen und Bits selber angeben, aber das ist ja halb so wild.


Anmelden zum Antworten