13

マルチモニターのフルスクリーンDXGI/D3Dアプリケーションを作成しています。スワップチェーンを作成する準備として、使用可能な出力とアダプターを列挙しています。

DXGIのIDXGIFactory::CreateSwapChainメソッドを使用してスワップチェーンを作成する場合、幅、高さ、リフレッシュレートなどの詳細を示す、タイプDXGI_MODE_DESCのバッファー記述を含むスワップチェーン記述を提供する必要があります。出力を確認するにはどうすればよいですか。現在に設定されています(または、出力の現在の表示モードを確認するにはどうすればよいですか)?このスワップチェーンで全画面表示にしたときに、ユーザーの解像度やリフレッシュレートを変更したくありません。

4

3 に答える 3

4

さらに調べてEnumDisplaySettingsみたところ、現在の解像度とリフレッシュ レートにアクセスできる従来の 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 でこれを行う方法はありますか?

于 2013-03-31T00:27:30.900 に答える
1

ここで解決策を見ました: http://www.rastertek.com/dx11tut03.html

次の部分で:

   // 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にあります。

于 2013-03-26T12:41:47.513 に答える
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;
}
于 2015-04-30T12:08:29.103 に答える