Изменение Режимов отображения (OS X v10.5)
Типичная задача конфигурации дисплея состоит в том, чтобы изменить режим единственного дисплея. Можно использовать функцию удобства CGDisplaySwitchToMode
сделать это на единственном шаге. Этот раздел показывает два способа найти и переключиться на лучший режим для данного дисплея.
Установка режима основного дисплея
В простом случае Вы хотите установить режим основного дисплея к режиму, наиболее близко соответствующему Вашу требуемую битовую глубину и разрешение. Когда Вы закончены, таща, Вы восстанавливаете предыдущий режим отображения. Нахождение Лучшего Режима от Доступных Режимов показывает, как сделать это. Подробное объяснение каждой пронумерованной строки кода появляется после перечисления.
Перечисление 1 , Устанавливающее режим основного дисплея
size_t desiredBitDepth = 16; |
size_t desiredWidth = 1024; |
size_t desiredHeight = 768; |
boolean_t exactMatch; |
CFDictionaryRef mode = CGDisplayBestModeForParameters( // 1 |
kCGDirectMainDisplay, |
desiredBitDepth, desiredWidth, |
desiredHeight, &exactMatch); |
if (mode != NULL) { |
/* if it is important to have an exact match, check exactMatch here */ |
MyDrawToDisplayWithMode (kCGDirectMainDisplay, mode); |
} |
void MyDrawToDisplayWithMode (CGDirectDisplayID display, CFDictionaryRef mode) |
{ |
CFDictionaryRef originalMode = CGDisplayCurrentMode (display); // 2 |
CGDisplayHideCursor (display); |
CGDisplaySwitchToMode (display, mode); // 3 |
CGDisplayCapture (display); // 4 |
/* full screen drawing/game loop here */ |
CGDisplaySwitchToMode (display, originalMode); // 5 |
CGDisplayRelease (display); // 6 |
CGDisplayShowCursor (display); |
} |
Вот то, что делает код:
Находит лучшее соответствие среди доступных режимов для указанного дисплея.
Сохраняет текущий режим отображения.
Реконфигурировал дисплей для использования нового режима отображения.
Получает дисплей для подготовки к полноэкранному получению.
Восстанавливает предыдущий режим отображения.
Выпускает полученный дисплей.
Нахождение лучшего режима от доступных режимов
В более сложном случае Вам нужно больше управления, по которому дисплею Вы используете или хотите определить для себя, что «означает лучший режим». Перечисление 1 показывает, как получить массив активных дисплеев, выполнить итерации по тому списку, исследующему режимы, которые поддерживает каждый дисплей, и выберите самый надлежащий дисплей и комбинацию режима для Вашего приложения.
Перечисление 2 , Исследующее доступные режимы
#define MAX_DISPLAYS 32 |
CGDirectDisplayID displays[MAX_DISPLAYS]; |
CGDisplayCount numDisplays; |
CGDisplayCount i; |
CGGetActiveDisplayList (MAX_DISPLAYS, displays, &numDisplays); // 1 |
for (i = 0; i < numDisplays; i++) // 2 |
{ |
CFDictionaryRef mode; |
CFIndex index, count; |
CFArrayRef modeList; |
modeList = CGDisplayAvailableModes (displays[i]); // 3 |
count = CFArrayGetCount (modeList); |
for (index = 0; index < count; index++) // 4 |
{ |
mode = CFArrayGetValueAtIndex (modeList, index); |
if (MyBestMode (mode)) { |
MyDrawToDisplayWithMode (displays[i], mode); // 5 |
} |
} |
} |
bool MyBestMode (CFDictionaryRef mode) // 6 |
{ |
CFNumberRef value; |
long bitsPerPixel = 0, width = 0; |
value = CFDictionaryGetValue (mode, kCGDisplayBitsPerPixel); |
CFNumberGetValue (value, kCFNumberLongType, &bitsPerPixel); |
value = CFDictionaryGetValue (mode, kCGDisplayWidth); |
CFNumberGetValue (value, kCFNumberLongType, &width); |
if (bitsPerPixel == 32 && width == 1024) |
return true; |
else |
return false; |
} |
Вот то, что делает код:
Получает массив активных дисплеев, которые являются теми доступными для рисования.
Выполняет итерации по массиву активных дисплеев. Обратите внимание на то, что массив является базируемым нулем.
Получает массив доступных режимов для этого дисплея.
Выполняет итерации по доступным режимам для дисплея, вызывая пользовательскую функцию, чтобы определить, имеет ли режим желаемые свойства.
Вызывает функцию получения, используемую в предыдущем примере.
Проверки два свойства в словаре режима и возвратах
true
если режим имеет желаемые свойства.