2009-01-07 79 views
0

我正在開發一個用於視頻錄製的應用程序,並且我想用標誌和錄製計時器覆蓋視頻預覽。DirectDraw問題 - 將應用程序作爲常規Windows應用程序運行

我試圖運行全屏應用程序,一切正常。然後我嘗試將該應用程序作爲常規Windows應用程序運行,並返回一個錯誤。

任何人都可以看看下面的代碼,如果有一種方法來修改它作爲常規的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; 
} 

回答

2

即使運行窗口時,你需要創建一個主面,只是它不是一個翻轉的表面。

//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; 

除了創建表面之外,很可能您希望爲窗口創建裁剪器。有關完整示例,請參閱在this GameDev article中運行窗口段落。

+0

這正是我所說的,但是一個小時過去了!? – 2009-01-07 23:37:22

2

它返回什麼錯誤?

也可以嘗試這個:

ddsd.dwFlags = DDSD_CAPS; 
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; 
相關問題