Problem mit BitBlt
-
Genau das blicke ich nicht durch. Was hat es denn jetzt mit dem SelectObject auf sich?
-
So irgendwie?
HDC hFontDC = CreateCompatibleDC(hdc); // Backbuffer DC wo der komplette Scrolltext draufliegt HBITMAP hbmFont = CreateCompatibleBitmap(hdc, 300, 50); //Laufband funktion int iDelay = 0; //32 Pixel Warten bevor nächster Buchstabe geblittet wird int iBuchstabePtr = 0; //Nächster Buchstabe der geblittet wird. SelectObject(hFontDC, hbmFont); ZeichneBuchstabe(hFontDC, Text[iBuchstabePtr], 0, 0); //Ab auf den Frontbuffer damit BitBlt(hdc, 0, 0, 32, 32, hFontDC, 32, 32, SRCCOPY); DeleteDC(hFontDC);
-
So gehts (nicht getestet):
// ... HDC hFontDC = CreateCompatibleDC(hdc); // Backbuffer DC wo der komplette Scrolltext draufliegt HBITMAP hbmpPrevBits; // alte Bitmap des Speicherkontextes hFontDC RECT rcClient; // Client-Bereich GetClientRect(hWnd, &rcClient); // hWnd ist das Fenster auf das gezeichnet werden soll // Bitmap in den Kontext einsetzen; alte Bitmap sichern: hbmpPrevBits = reinterpret_cast<HBITMAP>(SelectObject(hFontDC, CreateCompatibleBitmap(hdc, rcClient.right, rcClient.bottom))); //Laufband funktion int iDelay = 0; //32 Pixel Warten bevor nächster Buchstabe geblittet wird int iBuchstabePtr = 0; //Nächster Buchstabe der geblittet wird. ZeichneBuchstabe(hFontDC, Text[iBuchstabePtr], 0, 0); //Ab auf den Frontbuffer damit BitBlt(hdc, 0, 0, 32, 32, hFontDC, 32, 32, SRCCOPY); // alte Bitmap wieder einsetzen und Hintergrundbitmap (Puffer) löschen bzw freigeben: DeleteObject(SelectObject(hFontDC, hbmpPrevBits); DeleteDC(hFontDC); // ...Habs auch kommentiert

-
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, SwordfishJo 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?