C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Монитор и его характеристики., (WinAPI) / C++ для начинающих / C++

Как добиться от монитора его характеристик: разрешения, тактовой частоты и пр.? А поменять? Легко!
Есть несколько WinAPI функций. Фактически, приведу только список функций, приводить подробности глупо – поскольку все они есть в MSDN. В том же MSDN в конце каждого описания функции есть ссылки на близкие по назначению функции.

Как получить разрешение

GetDeviceCaps

      int GetDeviceCaps(
      HDC hdc,     // хэндл контекста устройства
      int nIndex     // “индекс возможностей” – индекс запрашиваемой характеристики
      );



Вернёт для вашего HDC всё что попросите. Попросить можно nIndex. Полный список возможных вопросов Вы найдёте в MSDN. Если вам нужно разрешение монитора (в пикселях), то действовать можно вот так:


HDC hdcScreen = GetWindowDC(GetDesktopWindow());
int  nXRes = GetDeviceCaps(hdcScreen, HORZRES); //взять разрешение по горизонтали
int  nYRes = GetDeviceCaps(hdcScreen, VERTRES); //взять разрешение по вертикали 



Обращу внимание, что эта функция может применяться не только к монитору, но и ко всему, что может иметь HDC, например, к принтеру. Кстати, с помощью nIndex = TECHNOLOGY можно получить по контексту устройства информацию о том, с чем же вы на самом деле имеете дело. Тактовую частоту (в Гц) обновления можно получить с помощью VREFRESH (правда, работать это будет лишь в Windows NT/2000).

Ещё одна интересная функция, в сторону которой стоит посмотреть: GetSystemMetrics




Перед тем как поменять настройки монитора, необходимо заполнить структуру DEVMODE. Это можно сделать с помощью функции EnumDisplaySettings

BOOL EnumDisplaySettings(LPCTSTR lpszDeviceName, 
                         DWORD iModeNum, 
                         LPDEVMODE lpDevMode);


Эта функция перечисляет все возможные характеристики дисплея. Первый параметр, lpszDeviceName, обозначает дисплей, для которого вы хотите перечислить характеристики. В общем то вы можете передать и NULL, но у MS есть проблемы при работе с много мониторными системами, особенно если у них отличающиеся характеристики. В этом случае вы должны передать "\\.\DisplayX", где Х может принять значение 1, 2, или 3.
Каждый монитор имеет свою коллекцию настроек, которые может поддерживать (каждый, кто копался в настройках монитора, их видел). iModeNum показывает номер "настройки" (пресета) в коллекции, который Вы хотите получить (первый пресета имеет №0). Возвращаемые значения настроек вы найдёте в параметре DEVMODE. DEVMODE имеет множество членов, но только 5 из них относятся к дисплеям.

Поменять разрешение монитора можно функцией ChangeDisplaySettings

Вот её прототип:

LONG ChangeDisplaySettings(
  LPDEVMODE lpDevMode,      // графический режим
  DWORD dwflags                 // опция графического режима
);



Если вам необходимо, что бы после завершения работы программы настройки монитора вернулись в исходное положение, ни в коем случае не устанавливайте флаг dwflags CDS_UPDATEREGISTRY, который разрешает прописывать обновлённые настройки монитора в реестр.


Если Вам необходимо поменять характеристики иного (не дисплея) устройсва, то в руки вам попадает функция ChangeDisplaySettingsEx:

LONG ChangeDisplaySettingsEx(
  LPCTSTR lpszDeviceName,  // name of display device
  LPDEVMODE lpDevMode,     // graphics mode
  HWND hwnd,               // not used; must be NULL
  DWORD dwflags,            // graphics mode options
  LPVOID lParam            // video parameters (or NULL)
);



Подробно описывать её не буду – если Вы добрались до программирования плоттеров и т.п. – то скорее всего Вы уже не читаете ФАК, а, возможно, пишете его.