2013-03-23 18 views
12

Sto creando un'applicazione DXGI/D3D a schermo intero multi-monitor. Sto enumerando attraverso le uscite e gli adattatori disponibili in preparazione alla creazione delle loro catene di scambio.Come ottenere la modalità di visualizzazione corrente (risoluzione, frequenza di aggiornamento) di un monitor/output in DXGI?

Quando si crea la mia catena di swap usando il metodo di DXGI IDXGIFactory::CreateSwapChain, ho bisogno di fornire una descrizione della catena di swap che comprende una descrizione del buffer di tipo DXGI_MODE_DESC che dettagli la larghezza, l'altezza, la frequenza di aggiornamento, ecc Come faccio a scoprire che cosa l'uscita è attualmente impostato su (o come posso scoprire qual è attualmente la modalità di visualizzazione dell'uscita)? Non voglio modificare la risoluzione o la frequenza di aggiornamento dell'utente quando vado a schermo intero con questa catena di scambio.

risposta

1

vidi soluzione qui: http://www.rastertek.com/dx11tut03.html

In parte 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; 
      } 
     } 
    } 

è la mia comprensione corretta, la risoluzione disponibile è in displayModeList.

+0

Spiacente, non sto cercando la modalità di visualizzazione _current_, non un elenco di modalità di visualizzazione _available_. Ma guardando il codice sorgente del link che mi hai fornito, mi ha portato a un diverso set di funzioni di Windows che potrebbe aiutarmi ad arrivare alla modalità di visualizzazione corrente ... –

3

Dopo aver guardato un po 'di più mi sono imbattuto nella funzione GDI legacy EnumDisplaySettings, che mi consente di accedere alla risoluzione corrente e alla frequenza di aggiornamento. Combinando questo con la funzione IDXGIOutput::FindClosestMatchingMode posso ottenere abbastanza vicino alla modalità di visualizzazione corrente:

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); 
} 

... Ma non credo che questo è davvero la risposta corretta perché sto bisogno di utilizzare le funzioni legacy. C'è un modo per farlo con DXGI per ottenere l'esatta modalità di visualizzazione corrente piuttosto che utilizzare questo metodo?

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