2013-03-23 2 views
12

Я создаю полноэкранное полноэкранное приложение DXGI/D3D с несколькими мониторами. Я перечисляю доступные выходы и адаптеры в процессе подготовки их своп-цепочек.Как получить текущий режим отображения (разрешение, частоту обновления) монитора/выхода в DXGI?

При создании моей подкачки цепи, используя IDXGIFactory::CreateSwapChain метод DXGI, я должен предоставить описание замены цепи, которая включает в себя описание буфера типа DXGI_MODE_DESC, который подробно ширину, высоту, скорость и т.д. Как я могу узнать, какой выход обновления в настоящее время установлен (или как я могу узнать, какой режим отображения вывода в настоящее время)? Я не хочу изменять разрешение пользователя или частоту обновления, когда я перехожу на полный экран с этой цепочкой подкачки.

ответ

1

Я видел решение здесь: http://www.rastertek.com/dx11tut03.html

В Folow части:

// Now go through all the display modes and find the one that matches the screen width and height. 
    // When a match is found store the numerator and denominator of the refresh rate for that monitor. 
    for(i=0; i<numModes; i++) 
    { 
     if(displayModeList[i].Width == (unsigned int)screenWidth) 
     { 
      if(displayModeList[i].Height == (unsigned int)screenHeight) 
      { 
       numerator = displayModeList[i].RefreshRate.Numerator; 
       denominator = displayModeList[i].RefreshRate.Denominator; 
      } 
     } 
    } 

я понимаю правильно, доступное разрешение в displayModeList.

+0

Извините, я не ищу режим отображения _current_, а не список режимов отображения _available_. Но глядя на исходный код ссылки, которую вы предоставили, привел меня к другому набору функций Windows, которые могут помочь мне перейти в текущий режим отображения ... –

3

Осмотрев еще немного, я наткнулся на функцию GDI , которая позволяет мне получить доступ к текущему разрешению и частоте обновления. В сочетании с функцией IDXGIOutput::FindClosestMatchingMode я могу получить довольно близко к текущему режиму отображения:

void getClosestDisplayModeToCurrent(IDXGIOutput* output, DXGI_MODE_DESC* outCurrentDisplayMode) 
{ 
    DXGI_OUTPUT_DESC outputDesc; 
    output->GetDesc(&outputDesc); 
    HMONITOR hMonitor = outputDesc.Monitor; 
    MONITORINFOEX monitorInfo; 
    monitorInfo.cbSize = sizeof(MONITORINFOEX); 
    GetMonitorInfo(hMonitor, &monitorInfo); 
    DEVMODE devMode; 
    devMode.dmSize = sizeof(DEVMODE); 
    devMode.dmDriverExtra = 0; 
    EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &devMode); 

    DXGI_MODE_DESC current; 
    current.Width = devMode.dmPelsWidth; 
    current.Height = devMode.dmPelsHeight; 
    bool useDefaultRefreshRate = 1 == devMode.dmDisplayFrequency || 0 == devMode.dmDisplayFrequency; 
    current.RefreshRate.Numerator = useDefaultRefreshRate ? 0 : devMode.dmDisplayFrequency; 
    current.RefreshRate.Denominator = useDefaultRefreshRate ? 0 : 1; 
    current.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
    current.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; 
    current.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; 

    output->FindClosestMatchingMode(&current, outCurrentDisplayMode, NULL); 
} 

... Но я не думаю, что это действительно правильный ответ, потому что я необходимость использовать устаревшие функции. Есть ли способ сделать это с помощью DXGI, чтобы получить точный текущий режим отображения, а не использовать этот метод?

0
This might be what you are looking for: 


      // Get display mode list 
      std::vector<DXGI_MODE_DESC*> modeList = GetDisplayModeList(*outputItor); 
      for(std::vector<DXGI_MODE_DESC*>::iterator modeItor = modeList.begin(); modeItor != modeList.end(); ++modeItor) 
      { 
      // PrintDisplayModeInfo(*modeItor); 
      } 
     } 




std::vector<DXGI_MODE_DESC*> GetDisplayModeList(IDXGIOutput* output) 
{ 
    UINT num = 0; 
    DXGI_FORMAT format = DXGI_FORMAT_R32G32B32A32_TYPELESS; 
    UINT flags = DXGI_ENUM_MODES_INTERLACED | DXGI_ENUM_MODES_SCALING; 

    // Get number of display modes 
    output->GetDisplayModeList(format, flags, &num, 0); 

    // Get display mode list 
    DXGI_MODE_DESC * pDescs = new DXGI_MODE_DESC[num]; 
    output->GetDisplayModeList(format, flags, &num, pDescs); 

    std::vector<DXGI_MODE_DESC*> displayList; 
    for(int i = 0; i < num; ++i) 
    { 
     displayList.push_back(&pDescs[i]); 
    } 

    return displayList; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^