2013-03-23 20 views
12

Tôi đang tạo một ứng dụng DXGI/D3D toàn màn hình đa màn hình. Tôi liệt kê thông qua các đầu ra và bộ điều hợp có sẵn để chuẩn bị tạo ra các chuỗi trao đổi của họ.Cách nhận chế độ hiển thị hiện tại (độ phân giải, tốc độ làm mới) của màn hình/đầu ra trong DXGI?

Khi tạo chuỗi trao đổi bằng phương pháp IDXGIFactory::CreateSwapChain của DXGI, tôi cần cung cấp mô tả chuỗi trao đổi bao gồm mô tả bộ đệm loại DXGI_MODE_DESC chi tiết chiều rộng, chiều cao, tốc độ làm mới, v.v. Làm cách nào để tìm hiểu đầu ra hiện đang được đặt thành (hoặc làm thế nào tôi có thể tìm ra chế độ hiển thị của đầu ra hiện tại là gì)? Tôi không muốn thay đổi độ phân giải hoặc tỷ lệ làm mới của người dùng khi tôi chuyển sang chế độ toàn màn hình với chuỗi trao đổi này.

Trả lời

1

tôi thấy giải pháp ở đây: http://www.rastertek.com/dx11tut03.html

Trong phần 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; 
      } 
     } 
    } 

là hiểu biết của tôi chính xác, độ phân giải có sẵn là trong displayModeList.

+0

Rất tiếc, tôi không tìm kiếm chế độ hiển thị _current_, không phải danh sách _available_ chế độ hiển thị. Nhưng nhìn vào mã nguồn của liên kết mà bạn cung cấp đã dẫn tôi đến một tập hợp các chức năng Windows khác có thể giúp tôi chuyển sang chế độ hiển thị hiện tại ... –

3

Sau khi xem xét một số thông tin khác, tôi đã gặp phải chức năng GDI cũ EnumDisplaySettings, cho phép tôi truy cập vào độ phân giải và tỷ lệ làm mới hiện tại. Kết hợp điều này với các chức năng IDXGIOutput::FindClosestMatchingMode tôi có thể nhận được khá gần với chế độ hiển thị hiện tại:

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

... Nhưng tôi không nghĩ rằng đây thực sự là câu trả lời đúng vì tôi cần phải sử dụng chức năng di sản. Có cách nào để làm điều này với DXGI để có được chế độ hiển thị chính xác hiện tại hơn là sử dụng phương pháp này?

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; 
} 
Các vấn đề liên quan