С++. Узнайте, какие разрешения поддерживаются графической картой.

Я пишу небольшую программу, чтобы позволить мне переключать разрешение взад и вперед, потому что мой проектор не может справиться с тем же разрешением, что и мой экран. Я уже знаю, как установить разрешение экрана с помощью API окон. Также прочитайте текущее разрешение с помощью API окон или инструментария QT4. Моя проблема в том, что я хочу меню всех различных разрешений, поддерживаемых экраном и графической картой. Эта программа будет распространена, поэтому мне нужна программа для фактического общения с видеокартой, чтобы узнать, что она поддерживает. Единственный API, который я хочу использовать, - это API Windows или набор инструментов QT4, но я не думаю, что QT4 делает это, если вы не используете графические виджеты нечетными способами.

Я уверен, что это возможно с помощью API WINDOWS. Я просто не знаю, как это сделать.

О, и, пожалуйста, сократите мне слабину, я знаком с QT4 и С++, но я, как правило, программист на Linux, я пишу это для кого-то еще. Единственное, что я когда-либо делал с API Windows, - это создать окно сообщения, установить фон и использовать системные переменные. Поэтому, пожалуйста, просто объясните процесс. Пожалуйста, не просто разместите ссылку на msdn, я ненавижу их документацию, и я ненавижу Microsoft. Я использую окна, возможно, два раза в год.

Ответ 1

В общем случае вам, вероятно, будет работать следующее:

DEVMODE dm = { 0 };
dm.dmSize = sizeof(dm);
for( int iModeNum = 0; EnumDisplaySettings( NULL, iModeNum, &dm ) != 0; iModeNum++ ) {
  cout << "Mode #" << iModeNum << " = " << dm.dmPelsWidth << "x" << dm.dmPelsHeight << endl;
  }

Это должно распечатать все поддерживаемые разрешения на текущем дисплее, на котором работает .exe. Предполагая, что вы не имеете дело с многодисплейной графической картой, это должно работать. В противном случае вам придется использовать цикл EnumDisplayDevices для каждого дисплея.

Как только вы выясните, какое разрешение вы хотите, вы можете использовать "ChangeDisplaySettingsEx", чтобы изменить отображение в нужном режиме.

Использование DirectX возможно, но я бы не рекомендовал его, так как код был намного сложнее (необходимо инициализировать DirectX и использовать указатели COM), если вы не планируете фактически использовать DirectX больше, чем просто определять разрешения дисплея.

Ответ 2

EnumDisplaySettings:)

Из MSDN:

"Чтобы получить текущие настройки дисплея, передайте константу ENUM_CURRENT_SETTINGS в параметре iModeNum API-интерфейсу EnumDisplaySettings, как показано на следующем С++-коде."

DEVMODE dm;
// initialize the DEVMODE structure
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(dm);
if (0 != EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm))
{
// inspect the DEVMODE structure to obtain details
// about the display settings such as
//  - Orientation
//  - Width and Height
//  - Frequency
//  - etc.
}