2009-01-07 77 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; 
相关问题