Изменение Режимов отображения (OS X v10.6 или позже)
Типичная задача конфигурации дисплея состоит в том, чтобы изменить режим единственного дисплея. Можно использовать функцию удобства CGDisplaySetDisplayMode
сделать это на единственном шаге. Этот раздел показывает один способ найти и переключиться на лучший режим для данного дисплея.
Нахождение лучшего режима от доступных режимов
Перечисление 1 показывает, как получить массив активных дисплеев, выполнить итерации по тому списку, исследующему режимы, которые поддерживает каждый дисплей, и выберите самый надлежащий дисплей и комбинацию режима для Вашего приложения.
Перечисление 1 , Исследующее доступные режимы
#define MAX_DISPLAYS 32 |
CGDirectDisplayID displays[MAX_DISPLAYS]; |
uint32_t numDisplays; |
uint32_t i; |
CGGetActiveDisplayList (MAX_DISPLAYS, displays, &numDisplays); // 1 |
for (i = 0; i < numDisplays; i++) // 2 |
{ |
CGDisplayModeRef mode; |
CFIndex index, count; |
CFArrayRef modeList; |
modeList = CGDisplayCopyAllDisplayModes (displays[i], NULL); // 3 |
count = CFArrayGetCount (modeList); |
for (index = 0; index < count; index++) // 4 |
{ |
mode = (CGDisplayModeRef)CFArrayGetValueAtIndex (modeList, index); |
if (MyBestMode (mode)) { |
MyDrawToDisplayWithMode (displays[i], mode); // 5 |
break; |
} |
} |
CFRelease(modeList);// 6 |
} |
bool MyBestMode (CFDisplayModeRef mode) // 7 |
{ |
long height = 0, width = 0; |
CFStringRef pixelEncoding; |
height=CGDisplayModeGetHeight(mode); |
width=CGDisplayModeGetWidth(mode); |
pixelEncoding=CGDisplayModeCopyPixelEncoding(mode); |
if (height == 640 && width == 1024 && CFStringCompare(pixelEncoding,CFSTR(IO32BitDirectPixels),0)==kCFCompareEqualTo) |
{ |
CFRelease(pixelEncoding); |
return true; |
} |
else |
{ |
CFRelease(pixelEncoding); |
return false; |
} |
} |
void MyDrawToDisplayWithMode (CGDirectDisplayID display, CGDisplayModeRef mode) |
{ |
CGDisplayModeRef originalMode = CGDisplayCopyDisplayMode (display); // 8 |
CGDisplayHideCursor (display); |
CGDisplaySetDisplayMode (display, mode, NULL); // 9 |
CGDisplayCapture (display); // 10 |
/* full screen drawing/game loop here */ |
CGDisplaySetDisplayMode (display, originalMode, NULL); // 11 |
CGDisplayModeRelease(originalMode); |
CGDisplayRelease (display); // 12 |
CGDisplayShowCursor (display); |
} |
Вот то, что делает код:
Получает массив активных дисплеев, которые являются теми доступными для рисования.
Выполняет итерации по массиву активных дисплеев. Обратите внимание на то, что массив является базируемым нулем.
Получает массив доступных режимов для этого дисплея.
Выполняет итерации по доступным режимам для дисплея, вызывая пользовательскую функцию, чтобы определить, имеет ли режим желаемые свойства.
Вызывает функцию получения.
Выпуски
CFArray
из режимов отображения, возвращенныхCGDisplayCopyAllDisplayModes
.Проверки два свойства в словаре режима и возвратах
true
если режим имеет желаемые свойства.Сохраняет текущий режим отображения.
Реконфигурировал дисплей для использования нового режима отображения.
Получает дисплей для подготовки к полноэкранному получению.
Восстанавливает предыдущий режим отображения.
Выпускает полученный дисплей.