На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
  
> Монитор и его характеристики. , (WinAPI)
    Как добиться от монитора его характеристик: разрешения, тактовой частоты и пр.? А поменять? Легко!
    Есть несколько WinAPI функций. Фактически, приведу только список функций, приводить подробности глупо – поскольку все они есть в MSDN. В том же MSDN в конце каждого описания функции есть ссылки на близкие по назначению функции.

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

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


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

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


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

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




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

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

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

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

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


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


    Если Вам необходимо поменять характеристики иного (не дисплея) устройсва, то в руки вам попадает функция ChangeDisplaySettingsEx:
    ExpandedWrap disabled
       
      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)
      );


    Подробно описывать её не буду – если Вы добрались до программирования плоттеров и т.п. – то скорее всего Вы уже не читаете ФАК, а, возможно, пишете его.
    Сообщение отредактировано: AQL -
      Ты только описал функции. Надо бы хоть по одному примеру их использования.
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0186 ]   [ 14 queries used ]   [ Generated: 15.05.24, 20:21 GMT ]