Вторник, 26.11.2024, 02:13 | Приветствую Вас Гость

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)
);

Подробно описывать её не буду – если Вы добрались до программирования плоттеров и т.п. – то скорее всего Вы уже не читаете ФАК, а, возможно, пишете его.
Категория: Мои статьи | Добавил: PvP (09.05.2010)
Просмотров: 1366 | Комментарии: 2 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Меню сайта
Категории раздела
Мои статьи [10]
Наш опрос
Вы создаёте игры на С++?
Всего ответов: 16
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Жизнь сайта
Добавь!
Поиск
Друзья и рейтинги
Топ100- Программирование