Problem mit BitBlt



  • wofür ist das hbmpPrevBits? Welches Bitmap sichert man da und warum?



  • Perner schrieb:

    wofür ist das hbmpPrevBits? Welches Bitmap sichert man da und warum?

    Naja man setzt in den Kontext ja ein GDI-Objekt ein...und alles was an GDI-Objekten in einem DC 'verschwindet', muss auch wieder rückgängig gemacht werden.

    Siehe MSDN:

    MSDN zu SelectObject(...) schrieb:

    This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.

    Ist also von M$ vorgeschrieben. In hbmpPrevBits wird also die Bitmap gespeichert (besser ein Handle darauf), die sich vorm Einsetzen unser Puffer-Bitmap im Speicherkontext hFontDC befindet.

    Hoffe das war verständlich. 😉

    EDIT: Vertipper 😡



  • Also verhällt sich das so ähnlich wie bei PUSH und POP bei assembler, richtig?



  • Wenn du mir PUSH und POP erklärst, kann ich dir darauf ne Antwort geben...kann kein Assem. :p



  • Servus CodeFinder!

    Hab' grad keine Ahnung, worums bei euch geht, aber

    PUSH legt einen Wert auf den Stack,
    POP holt ihn wieder ab.

    Greetz, Swordfish



  • Hi Sworty 😉

    Jo, Danke 👍

    Kannst du Assembler ?

    EDIT: Kannst mir mal eben sagen, wie die Textfarbe eines deaktivierten Editfeld ändere ?



  • Laut msdn erzeugt CreateCompatibleDC() ein DC, in das eine 1x1 Pixel große Monochrom-Bitmap reinselektiert ist, die bei DestroyDC() mitgelöscht wird, sofern man sie vorher wieder zurückselektiert hat 😉

    Da ne 1x1 Pixel große Monochrom-Bitmap nicht unbedingt hilfreich ist muss man vorher ne passende reinselektieren und anschließend wieder die ursprüngliche reinhauen 😉

    Wesentlich komfortabler kann man mit GDI+ werkeln
    (Nachteil: Es ist etwas langsamer und es gibt Unterschiede beim Text rendern zwischen GDI+ und GDI, Vorteil: Alpha-Channel, Graphics.DrawString(), Graphics.DrawImage(), Speichern von bmp, jpg, gif, png, und generell nicht das lästige hantieren mit SelectObject() und CreateCompatibleDC() etc...)



  • CodeFinder schrieb:

    Hi Sworty 😉

    Hi Cody 😉

    Jo, Danke 👍

    CodeFinder schrieb:

    Kannst du Assembler?

    Ja.

    CodeFinder schrieb:

    Kannst mir mal eben sagen, wie die Textfarbe eines deaktivierten Editfeld ändere ?

    Nö, ich hab' mich mit der WinAPI noch nie soweit beschäftigt, das ich auf jede Frage eine Antwort wüsste. Wenn ich was brauch durchforste ich die lokal installierte MSDN. Sorry.

    Greetz, Swordfish



  • Swordfish schrieb:

    Nö, ich hab' mich mit der WinAPI noch nie soweit beschäftigt, das ich auf jede Frage eine Antwort wüsste. Wenn ich was brauch durchforste ich die lokal installierte MSDN. Sorry.
    Greetz, Swordfish

    Jo nit schlimm, bin zum Schluss gekommen, das es nit geht, habs schon (zwangläufig :p ) anders gelößt. Trotzdem thX



  • Ah danke, ich glaube ich habs jetzt. Der gerätekontext ist also eine art Zeiger, der auf ein Bitmap zeigt. Wenn ich BitBlt mache wird dieses Bitmap worauf der Gerätekontext zeigt ausgelesen/beschrieben, richtig?

    Bei mir funktioniert es auf jedenfall jetzt. 🙂



  • Also ein Handle (also auch HDC - Handle to a Device Context) ist eigentlich immer ein Zeiger auf einen Speicherbereich, der dann je nach Typ es Handles entsprechend interpretiert wird...

    Beispiel:
    HWND - Handle to a WiNDow
    Hier hast du einen Pointer auf einen Speicherbereich, der Informationen über ein Fenster 'enthält'. Glaube intern arbeiten die dann sogar mit Strukturen (must dir mal die Definition des Makros DECLARE_HANDLE() angucken, mit welchem die Handle der Win32API deklariert wurden.).



  • Mal angenommen, ich selecte so einen DC nicht zurück, sondern schreibe bloß:

    HBITMAP bitmap=CreateCompatibleBitmap (hDC, 20, 20);
    HDC dc=CreateCompatibleDC (hDC);
    
    SelectObject (dc, bitmap);
    
    //...
    
    DeleteDC (dc);
    DeleteObject (bitmap);
    

    Ohne den Ursprungszustand des DCs abzufangen. Gibt es dann tatsächliche Probleme? Kommt es zu Memory Leaks oder ist das Abfangen des alten Zustands bloß so eine Art eingebürgerter Standard, der aber ansonsten keine Auswirkungen hat?


Anmelden zum Antworten