Hifle mit DirectDraw Overlays!
-
Tag'chen!
Also ich habe mir jetzt schon einige Tutorials bzw. Beiträge zu DD 'Overlays' angeschaut und es fällt mir auch nicht wirklich schwer:
- DD zu initialisieren
- die primary surface zu erstellen
- die overlay surface mit dem Pixelformat zu erstellen
- einen Backbuffer für das Overlay zu erstellen und anzuhängen
- alle evtl. auftretenden Fehler abzufragen
- alles ordnungsgemäß wieder auf zu räumenWas jetzt mein Problem ist, ist das ichnicht wirklich weiter weiß wie ich mein Overlay richtig positioniere und ins Bild flippe?
Ich will für die Positionierung und für das Updaten des Overlays wieder jeweils eine Funktion schreiben. Sicherlich die Updatefunktion muss in die WM_PAINT, doch kann ich hier auch gleich die Positionierung reinschieben?
Ich möchte das Overlay nicht in meinem Fenstern positionieren, ondern frei irgendwo auf dem Bildschirm( zum Anfang würde mir die linke-obere Ecke
reichen ).Könntet ihr mir hier bei der Sache evtl. etwas zur Hand gehen?
Gruß Tobi.
-
Hallo ich hab mal etwas alleine rumprobiert bin allerdings net wirklich zufrieden. Hier mal die Updatefunktion:
// ***** Update the overlay and repositionate it on screen ***** bool fUpdateOverlay( ) { HDC hDC; RECT descRect; // HRESULT result; // ***** Draw something to the backbuffer ***** g_lpBack->GetDC( &hDC ); SetTextColor( hDC, RGB( 255, 255, 255 ) ); SetBkColor( hDC, TRANSPARENT ); TextOut( hDC, 5, 5, "Test", 4 ); g_lpBack->ReleaseDC( hDC ); // ***** Now flip it to screen ***** g_lpOver->Flip( 0, DDFLIP_WAIT ); // ***** Set position of overlay ***** descRect.left = 0; descRect.top = 0; descRect.right = 250; descRect.bottom = 100; g_ddofx.dwSize = sizeof( DDOVERLAYFX ); g_lpOver->UpdateOverlay( 0, g_lpPrim, &descRect, DDOVER_SHOW | DDOVER_DDFX, &g_ddofx ); return true; }Sobald ich das Programm starte ist die auslastung meiner CPU echt enorm. Alles stockt etwas bei der Neuzeichnung von Fenstern ect. Also irgendwas kann da noch nicht ganz richtig sein.
Noch zwei Fragen haette ich da:
(1)
Das mit der Flip-Methode und dem Backbuffer hab ich aus nem Tutorial, was ich nicht verstehe ist wieso übergibt der da bei GetDC( ) ein HDC object?, müsste es ja nicht ein Fensterhandle sein?( Was aber eigentlich net sein kann weil es soll ja in kein Fenster geclippt werden. )(2)
Ich habe diese Funktion in WM_PAINT gepackt dort scheint es ja auch zu klappen das ich das Overlay sehe. Aber wieso sehe ich das Overlay nicht wenn ich ein Timer für die Funktion anlege und sie da rein packe ?gruß Tobi.
-
keiner ne Idde? wegen den beiden fragen (1) und (2) ???
-
was ich nicht verstehe ist wieso übergibt der da bei GetDC( ) ein HDC object?
da du deine dokumentation offenbar nicht dabei hast, lass ich dich mal in meine gucken:
The GetDC method creates a GDI-compatible hDC for the surface. It uses an internal version of the Lock member to lock the surface, and the surface will remain locked until DirectDraw's ReleaseDC member is called.
Syntax
HRESULT GetDC(HDCFAR *lphD);Parameters
lphDC - Points to the hDC returnedbzgl der anderen frage enthaelt dein posting leider keinerlei anhaltspunkte.