Каталог статей
Монитор и его характеристики
Как добиться от монитора его характеристик: разрешения, тактовой частоты и пр.?
А поменять? Легко! Есть несколько 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) );
|
Подробно
описывать её не буду – если Вы добрались до программирования плоттеров и т.п. –
то скорее всего Вы уже не читаете ФАК, а, возможно, пишете его.
|
| Категория: С/С++/MFC | Добавил: Cromartie (31.01.2013)
|
| Просмотров: 494
| Рейтинг: 0.0/0 |
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
|
| Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
|