2010-11-03 4 views
10

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

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

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

+0

По какой-либо причине вы ограничены самим API Win32? DirectX API инкапсулирует эту функциональность, так что вам не нужно иметь дело с разными производителями графических карт. –

+6

«Пожалуйста, не просто разместите ссылку на msdn, я ненавижу их документацию, и я ненавижу Microsoft». Действительно !? Документация MSDN, как правило, фантастическая. – James

ответ

17

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

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 для более чем простого определения разрешений дисплея.

+0

это именно то, что я хотел, я не понимал, что каждый номер режима был каждой поддержкой res, и что 0 был текущим, спасибо –

+0

разве это не интересно, что я могу посмотреть на примерный код и понять его лучше, чем читать info off the msdn –

+0

@ TheDude У каждого свой стиль обучения. Твои и мои, кажется, «учатся на примере». – deed02392

2

EnumDisplaySettings :)

Из MSDN:

"Чтобы получить текущие настройки дисплея, проходят постоянные ENUM_CURRENT_SETTINGS в параметре iModeNum к EnumDisplaySettings API, как показано в следующем коде 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. 
} 
+2

Забавно, что единственное слово в вашем ответе - это ссылка на MSDN, о которой вопроситель явно заявил, что его не интересует ... –

+0

@ Frédéric Hamidi. Я добавил пример. – YWE

+0

Я не вижу, где это сказал «Чувак». Он сказал, что «Windows API», и ссылка указывает на функцию в GDI, которая является сертифицированной частью Windows API. Мне кажется, это именно то, о чем просили. –

Смежные вопросы