JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=ab7b7b9d9c961477b38b9f54d1283e21Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Direct Draw im Fenstermodus

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
smile_virus
Junior JLI'ler


Alter: 34
Anmeldedatum: 19.08.2004
Beiträge: 64

Medaillen: Keine

BeitragVerfasst am: 31.12.2005, 13:11    Titel: Direct Draw im Fenstermodus Antworten mit Zitat

Nach http://www.codeworx.org/directx_tuts_dd3_3.php bekommt man Direct Draw im Fenstermodus, wenn man bei SetCooperativeLevel statt DDSCL_FULLSCREEN DDSCL_NORMAL angibt.
Allerdings klappt das nicht, es wird nicht DD_OK zurückgegeben und DXGetErrorString9 gibt "E_INVALIDARG" zurück.
Wie bekomm ich denn eine Fensteranwendung mit Direct Draw hin?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 31.12.2005, 13:32    Titel: Antworten mit Zitat

windowed ist mit Direct Draw ne ganz komplizierte Sache, wenn mans net kennt. Da musst du z.B. einen Clipper einführen und die Flip-Funktion weglassen und ersetzen usw. Wie das geht würde jetz hier zu lange dauern, das zu erkären (ne t10ottoo? Wink ) Aber es gibt ein gutes englisches Tutorial, was das ganz anschaulich erklärt(speziell unter dem Punkt "Running Windowed". Viel Spaß Wink

Gruß DirectXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 31.12.2005, 13:42    Titel: Antworten mit Zitat

Kompliziert? Nicht wirklich, halt nur anders. Hab' das mal ganz elegant hinbekommen. Wenn du magst, kannst du mich in den nächsten Tagen ja mal anlabern, ICQ-Nummer steht im Profil.

Kurz lässt sich sagen, dass es zum Einen keinen Backbuffer gibt, um Doublebuffering hinzubekommen blittest du immer alles zuerst in eine Surface und blittest diese dann auf einen Rutsch in den Frontbuffer, ist also im Grunde klassisches Doublebuffering, nur dass DD dir dafür nicht direkt einen Backbuffer zur Verfügung stellt.

Dadurch entfällt auch das sog. 'flippen', es gibt ja keinen Backbuffer, dessen Inhalt in den Frontbuffer 'geflippt' werden könnte (du übernimmst das selber mittels o.g. Blit).

Ansonsten musst du noch beachten, dass du immer korrekt ins Fenster zeichnest, grade das kann am Anfang ein wenig knifflig sein, da es mit DD praktisch möglich ist, auch außerhalb des Fenster zu zeichen, das aber ja nicht Sinn und Zweck der Sache ist.
Weiterhin wird das ganze etwas verkompliziert, da der reine Clientbereich, der für den eigentlich Fensterinhalt gedacht ist, sich afaik nicht einfach mittels einer API-Funktion ermitteln lässt. An dieser Stelle muss, soweit ich mich erinnern kann 'GetWindowRect()' herhalten, diese Funktion liefert dir jedoch ein Rect, welches das komplette Fenster beschreibt, an dieser Stelle müsste dir nun wiederum 'AdjustWindowRectEx()' weiterhelfen.

Ist alles schon etwas länger her, dass ich das letzte mal mit DD gearbeitet habe, aber so müsste es funktionieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
smile_virus
Junior JLI'ler


Alter: 34
Anmeldedatum: 19.08.2004
Beiträge: 64

Medaillen: Keine

BeitragVerfasst am: 01.01.2006, 16:41    Titel: Antworten mit Zitat

danke für den Link DXer und für dein Angebot, GreveN
hab ich soweit ganz gut hinbekommen, aber da gibts ein neues Problem, und zwar wenn ich ein anderes Programm in den Vordergrund rufe bleibt die Fläche, die ich per DDraw dahingemalt hab grafisch immer noch im Vordergrund,
wie mach ich das, dass der Teil der von anderen Fenster übderdeckt werden sollte nicht angezeigt wird?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.01.2006, 17:50    Titel: Antworten mit Zitat

smile_virus hat Folgendes geschrieben:
danke für den Link DXer und für dein Angebot, GreveN
hab ich soweit ganz gut hinbekommen, aber da gibts ein neues Problem, und zwar wenn ich ein anderes Programm in den Vordergrund rufe bleibt die Fläche, die ich per DDraw dahingemalt hab grafisch immer noch im Vordergrund,
wie mach ich das, dass der Teil der von anderen Fenster übderdeckt werden sollte nicht angezeigt wird?

das kommt normalerweise davon, dass du den Clipper nicht angegeben hast. Guck ma, ob, nachdem du Clipper->SetHWnd( ... ) aufrufst, du diese zeile in etwa hast:
CPP:
lpDDSPrimary->SetClipper( lpddClipper );


Gruß DirectXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 01.01.2006, 17:55    Titel: Antworten mit Zitat

Das resultiert eben aus dem Umstand, dass DD ja einen Window-Mode so gar nicht kennt, das von mir o.g. Problem, mit dem Zeichnen außerhalb des Clientbereichs des Fensters resultiert z.B. daraus, dass der Frontbuffer in DD immer die volle Bildschirmgröße umfasst. Es heißt, es interessiert DD auf gut deutsch einen Dreck, wo dein Fenster ist, wie groß es ist, wie es aussieht, usw.

Letztendlich muss aber alles, was du irgendwie mittels DD anzeigen willst in den Frontbuffer gepackt werden, dieser ist ein Speicherbereich auf der Grafikkarte (vgl. Surface) und beinhaltet einfach alles, was gerade auf dem Screen zusehen ist.
Soweit comprende? Wink

Ich hoffe, du verstehst mit dieser kurzen Vorrede die Ursache für dein Problem. Wenn dein Fenster vlt. grade minimiert ist, dass Programm aber im Hintergrund weiterläuft und brav auf dem Frontbuffer rummalt, siehst du natürlich auch die Ergebnisse weiterhin. Wink

Doublebuffering könnte dir insoweit weiter helfen, dass du den Inhalt des Backbuffers einfach nur dann in den Frontbuffer 'flippst', wenn dein Fenster grade aktiv ist.

Edit: Ups, hab' über meinem ganzen Geschwafel die Frage ansich evt. etwas verdreht, in dem Fall, musst du natürlich checken wo die Fenster sind, wie groß sie sind, wie sie sich zueinander verhalten und dann entsprechend reagieren, also Teile deines 'Bildes' vor dem 'Flip' wegclippen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.01.2006, 18:34    Titel: Antworten mit Zitat

GreveN hat Folgendes geschrieben:

Doublebuffering könnte dir insoweit weiter helfen, dass du den Inhalt des Backbuffers einfach nur dann in den Frontbuffer 'flippst', wenn dein Fenster grade aktiv ist.

Edit: Ups, hab' über meinem ganzen Geschwafel die Frage ansich evt. etwas verdreht, in dem Fall, musst du natürlich checken wo die Fenster sind, wie groß sie sind, wie sie sich zueinander verhalten und dann entsprechend reagieren, also Teile deines 'Bildes' vor dem 'Flip' wegclippen.

AFAIK gibts beim Windowed eigentlich gar keinen 'Flip', wie du ihn vom Fullscreen her kennst, da musst du alles in die richtigen Bereiche 'blitten'. Aber ich glaube GreveN meinte das selbe, ich will jetz auf jeden Fall net auf Besserwisser machen oder so, sondern nur klarstellen, dass man die Funktion Flip() im Windowed net aufrufen kann, also net irritieren lassen Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 01.01.2006, 18:39    Titel: Antworten mit Zitat

*hust*
Darum das Wort Flip in Anführungszeichen.

Hab ja in meinem 1. Post versucht zu erklären, wie sich das genau verhält.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
smile_virus
Junior JLI'ler


Alter: 34
Anmeldedatum: 19.08.2004
Beiträge: 64

Medaillen: Keine

BeitragVerfasst am: 01.01.2006, 20:17    Titel: Antworten mit Zitat

ihr gebt euch ja Mühe aber ich habs schon verstanden (:
ja es lag am Clipper, ich hab ihn rausgelassen weil ich ihn für überflüssig halte
Dankeschööön
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 01.01.2006, 21:00    Titel: Antworten mit Zitat

Du hast den Clipper nu ganz rausgenommen?
Also ich hab ihn noch drinne, arbeite zur Zeit auch im Fenstermodus und klappt wunderbar:
CPP:
// Clipper erstellen, um sicher zu gehen, dass man im Fenster zeichnet
    ddrval = lpDD7->CreateClipper( 0, &lpddClipper, NULL );
    if( ddrval != DD_OK )
    {
        lpDDSPrimary->Release();
        lpDD7->Release();
        return FALSE;
    }

    // Dem Clipper die Koordinaten vom Fenster übergeben (hwnd)
    ddrval = lpddClipper->SetHWnd( 0, hwnd );
    if( ddrval != DD_OK )
    {
        lpddClipper-> Release();
        lpDDSPrimary->Release();
        lpDD7->Release();
        return FALSE;
    }

    // Hänge den Clipper an die primäre Oberfläche
    ddrval = lpDDSPrimary->SetClipper( lpddClipper );
    if( ddrval != DD_OK )
    {
        lpddClipper-> Release();
        lpDDSPrimary->Release();
        lpDD7->Release();
        return FALSE;
    }

Aussschnitt meiner DirectDraw-Klasse

[edit]
Oder haste ihn vorher rausgelassen und nun doch wieder drinne? *verwirrt bin* *g*
_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum