C ++ Выяснение, какие разрешения поддерживаются видеокартой - PullRequest
9 голосов
/ 03 ноября 2010

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

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

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

Ответы [ 2 ]

17 голосов
/ 03 ноября 2010

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

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 голосов
/ 03 ноября 2010

EnumDisplaySettings :)

От MSDN:

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

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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...