Обнаружение видеорежимов
На следующем этапе необходимо определить все видеорежимы, поддерживаемые инициализированным драйвером DirectDraw. Для перечисления видеорежимов используется функция
EnumDisplayModes(), аналогичная рассмотренной выше функции
DirectDrawEnumerate(). В обоих случаях для перечисления используются косвенно вызываемые функции, а также предоставляются средства для передачи им данных, определяемых приложением. В нашем случае
DisplayModeAvailable() является функцией косвенного вызова (callback function), а указатель
this ссылается на произвольные данные. Функция
DisplayModeAvailable() выглядит так:
HRESULT WINAPI DirectDrawWin::DisplayModeAvailable( LPDDSURFACEDESC desc, LPVOID p ) { DirectDrawWin* win=(DirectDrawWin*)p; int& count=win->totaldisplaymodes; if (count==MAXDISPLAYMODES) return DDENUMRET_CANCEL; win->displaymode[count].width = desc->dwWidth; win->displaymode[count].height = desc->dwHeight; win->displaymode[count].depth = desc->ddpfPixelFormat.dwRGBBitCount; count++; return DDENUMRET_OK; }
|
DirectDraw вызывает функцию
DisplayModeAvailable() для каждого поддерживаемого видеорежима. Структура
DDSURFACEDESC, передаваемая косвенно вызываемой функции, содержит описание обнаруженного видеорежима. Функция
DisplayModeAvailable() сохраняет разрешение экрана и глубину пикселей в специальном массиве, называемом
displaymode. В переменной
total displaymodes хранится количество обнаруженных видеорежимов; если значение
totaldisplaymodes достигает
MAXDISPLAYMODES, перечисление завершается возвратом кода
DDENUMRET_CANCEL.
Затем функция
OnCreate() сортирует элементы
displaymode так, чтобы режимы с низким разрешением находились в начале массива. Это делается с помощью функции Win32
qsort(), которой передается функция косвенного вызова для «сравнения» видеорежимов. В нашем случае используется функция
CompareModes(), которая сравнивает видеорежимы сначала по разрешению, а затем по глубине пикселей. Я пропускаю дальнейшее обсуждение
CompareModes(), потому что оно не имеет никакого отношения к DirectDraw.
Содержание Назад Вперед