Ручки монитора DirectX11

Я переношу устаревший код с Dx9 на Dx11. Мне удалось перенести создание устройства D3D и контекста в порядке, но есть часть устаревшего кода, который необходимо поддерживать, и я не могу понять, как перенести его на Dx11.

Рассматриваемый код использует функции Win32, чтобы получить дескриптор монитора следующим образом:

DEVMODE dm = { 0 };
dm.dmSize = sizeof(DEVMODE);
EnumDisplaySettings("\\\\.\\DISPLAY3", ENUM_CURRENT_SETTINGS, &dm);

POINT p = { dm.dmPosition.x, dm.dmPosition.y };
HMONITOR hMonitorGDI = MonitorFromPoint(p, MONITOR_DEFAULTTONEAREST);

Затем он перебирает мониторы адаптеров, подключенные к устройству d3d9, и ищет соответствующий дескриптор:

unsigned int uiAdapterCount = m_p_d3d9->GetAdapterCount();
for (unsigned int i = 0; i < uiAdapterCount; ++i) {
    HMONITOR hMonitorD3D = m_p_d3d9->GetAdapterMonitor(i);
    if (hMonitorD3D == hMonitorGDI)
    {
        p_is->uiAdapter = i;
        break;
    }
}

Я не могу из любви ко мне понять, как сделать эквивалент в Dx11. Я научился создавать DXGIFactory и через него получать информацию об адаптере и выводе (мониторе), но я не могу найти ничего в отношении получения дескриптора монитора в Dx11.


person TheRarebit    schedule 22.09.2014    source источник


Ответы (1)


Вы можете использовать IDXGIFactory::EnumAdapters для перечисления каждого адаптера и IDXGIAdapter::EnumOutputs для перечисления выходных данных каждого адаптера. Затем вызовите IDXGIOutput::GetDesc, чтобы получить структуру DXGI_OUTPUT_DESC, включающую HMONITOR дескриптор вывода.

Вы можете пропустить шаг или два в своем примере кода GDI, выполнив поиск вывода с теми же координатами рабочего стола или, возможно, именем устройства.

person Ross Ridge    schedule 22.09.2014
comment
Я не могу поверить, что выполнил все эти шаги, прежде чем задать этот вопрос, и пропустил переменную Monitor. Какой тупица. Спасибо за это, работает как шарм :) - person TheRarebit; 23.09.2014