JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Dialog geht im excl. FullScreenMode (mit aufpassen)

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



Anmeldedatum: 07.11.2002
Beiträge: 66
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 30.07.2003, 19:13    Titel: Dialog geht im excl. FullScreenMode (mit aufpassen) Antworten mit Zitat

hallo

ich benutze (nach dem DX8 Beispiel fullscreendialog) normale win-Dialoge auch im exclusive fullscreen-modus
ABER:
50/50 erscheint der Dialog mal und mal erst nach Flip().


momentane (amateur-) Loesung:
1. lass ich einfach Flip() oder Present weg waehrend des Dialoges:
if(!windowed && !g_FullscreenDialog)Flip() oder ...Present(...)
//(damit nix flackert, das spiel
//wird weiter berechnet im Thread)

2. ruf ich einfach Flip() auf, wenn man den Dialog das zweite mal aufruft (weil er noch nicht sichtbar ist= weil er im momentanen BackBuffer ist):
" (mit aufpassen) " Sad

//////anfang SHOW_DIALOGfull
void SHOW_DIALOGfullexit()
//VK_F10
{
g_FullDiag =0; //EXIT
EndDialog(
g_hWndDlg, TRUE );
g_hWndDlg = NULL; //EXIT
}


void SHOW_DIALOGfull( HWND hWnd )
// case IDM_SHOW_DIALOGfull: //full: VK_F5
{
HINSTANCE hInst; //, hInstDlg;

#ifdef _WIN64
hInst = (HINSTANCE) GetWindowLongPtr( hWnd, GWLP_HINSTANCE );
#else
hInst = (HINSTANCE) GetWindowLong( hWnd, GWL_HINSTANCE );
#endif

if(!g_hWndDlg)
//wenn der noch nicht da is
{
////WAERE SUPER, wer weiss wie das geht
////FlipToGDISurface(THIS);
g_hWndDlg = CreateDialog(
hInst,
MAKEINTRESOURCE(IDD_DIALOG_SAMPLE),
hWnd, (DLGPROC) SampleDlgProc );
}
else if(g_FullDiag > 1) //1mal
{
g_FullDiag--;
//wenn == 1 wird es nicht mehr aufgerufen
//wegen oben else if(g_FullDiag > 1)

EndDialog( g_hWndDlg,TRUE );
//koennte unnoetig sein
//aber never change a running code Smile)

g_hWndDlg = CreateDialog(
hInst, MAKEINTRESOURCE(IDD_DIALOG_SAMPLE),
hWnd, (DLGPROC) SampleDlgProc );

m_pd3dDevice->Present( NULL, NULL, NULL, NULL );
//entweder der Dialog is da oder beim 2.mal aufruf
}

if(m_bWindowed ) ShowWindow( g_hWndDlg, SW_SHOW );
else ShowWindow( g_hWndDlg, SW_SHOWMAXIMIZED );
//damit nix beim verschieben/groesse veraendern nervt
//groesse veraendern hab ich im fullscreen gesperrt
}


//und sonst
//in zusammenhang mit Render():
...
if(g_FullDiag)
m_pd3dDevice->Present( NULL, NULL, NULL, NULL );
//bzw
Flip();
...
//////ende SHOW_DIALOGfull



//anstelle von allen Amateur-Kunstgriffen wuerde
//ich gern immer zum richtigen buffer schalten:

////*******entweder mit
////FlipToGDISurface(THIS);

////*******oder auch noch amateurmaessig ich
//frag ein (paar) pixel-farben meines fullscreen ab
//um zu entscheiden:
//wenn Dialog zu sehen == farbe is nicht von meinem spiel: OK
//wenn Dialog nicht zu sehen: Flip() bzw. Present(....)
//folgendes ging aber nicht:


//////////////////anfang GetDlgPixColor()
void GetDlgPixColor()
{
LPDIRECT3DSURFACE8 pBack ;
pBack = g_pApp->m_b_BackBuf;
D3DLOCKED_RECT lr;
pBack->LockRect( &lr, NULL, 0 );

// pointer to the associated surface memory
//so wars im jli-text-beispiel zum oberflaeche sperren:
//...
//WORD* wlpSurface=(WORD*)DDSurfDesc.lpSurface;
//das geht leider nicht:
WORD* wlpSurface=(WORD*)pBack;
//weil der back-buffer is im Grafikkartenspeicher????
//muss ich den erst in RAM kopieren????

int Pitch=64; //mein erkennungs-Pixel-Offset
g_DlgPixColor =(unsigned int) wlpSurface[Pitch]; ////x + y * Pitch];
pBack->UnlockRect();
}
/////////////////ende GetDlgPixColor()



////******oder am liebsten
////so wie im DX-Aufruf des Input Config Screens:
BOOL CMyD3DApplication::ConfigureInputDevicesCB(
IUnknown* pUnknown )
{...
LPDIRECT3DSURFACE8 pBackBuffer;
m_pd3dDevice->GetBackBuffer(
0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
m_pd3dDevice->CopyRects(
pConfigSurface, &rcSrc, 1, pBackBuffer,
&ptDst );
pBackBuffer->Release();

// Present the backbuffer contents to the front buffer
m_pd3dDevice->Present( NULL, NULL, NULL, NULL );

// Release the surface
pConfigSurface->Release();
}




erbitte einen tip

danke



aber ich will auch was beitragen
(und nicht nur fragen stellen) Smile))

ich poste gleich mal den

aufruf einer console fuer in/out im fullscreenmodus auf dem 2. monitor

und ein beispiel fuer Threads aus dem www


gruesse aus berlin

andi
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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