Вопрос DirectDraw - запуск приложения как обычного приложения Windows - PullRequest
0 голосов
/ 07 января 2009

Я разрабатываю приложение для записи видео и хочу наложить предварительный просмотр видео на логотип и таймер записи.

Я попытался запустить полноэкранное приложение, и все работало нормально. Затем я попытался запустить приложение как обычное приложение 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 ]

2 голосов
/ 07 января 2009

Даже при работе в оконном режиме вам необходимо создать первичную поверхность, только она не является скользкой поверхностью.

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

Помимо создания поверхности, скорее всего, вы захотите создать клипер для окна. Для полного примера см. Параграф «Запуск окна» в этой статье GameDev .

2 голосов
/ 07 января 2009

Какую ошибку он вернул?

Также попробуйте это вместо:

ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
...