Domanda DirectDraw: esecuzione dell'applicazione come normale applicazione Windows
-
05-07-2019 - |
Domanda
Sto sviluppando un'applicazione per la registrazione di video e voglio sovrapporre l'anteprima del video con un logo e un timer di registrazione.
Ho provato a eseguire l'applicazione a schermo intero e tutto ha funzionato bene. Quindi ho provato a eseguire l'applicazione come una normale applicazione Windows e ha restituito un errore.
Qualcuno potrebbe dare un'occhiata al codice qui sotto se c'è un modo per modificarlo per eseguire l'applicazione come una normale app di Windows?
HRESULT CViewfinderRenderer::OnStartStreaming()
{
HRESULT hr = S_OK;
DDSURFACEDESC ddsd;
m_pDD = NULL;
//full screen settings
hr = DirectDrawCreate(NULL, &m_pDD, NULL);
hr = m_pDD->SetCooperativeLevel(m_hWnd, DDSCL_FULLSCREEN);
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_FLIP | DDSCAPS_PRIMARYSURFACE;
ddsd.dwBackBufferCount = 1;
//end full screen settings
//normal settings
/*hr = DirectDrawCreate(NULL, &m_pDD, NULL);
hr = m_pDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL);
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_BACKBUFFERCOUNT;
ddsd.dwBackBufferCount = 1;*/
//end normal settings
hr = m_pDD->CreateSurface(&ddsd, &m_pSurface, NULL);
if (hr != DD_OK) {
return hr;
}
// Get backsurface
hr = m_pSurface->EnumAttachedSurfaces(&m_pBackSurface, EnumFunction);
return S_OK;
}
Soluzione
Anche quando si esegue finestre, è necessario creare una superficie primaria, ma non è una superficie ruotabile.
//full screen settings
hr = DirectDrawCreate(NULL, &m_pDD, NULL);
hr = m_pDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL);
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
Oltre a creare una superficie, molto probabilmente vorrai creare un tagliatore per la finestra. Per un esempio completo, vedi il paragrafo Esecuzione in finestra questo articolo di GameDev .
Altri suggerimenti
Quale errore ha restituito?
Prova anche questo invece:
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;