Чтение онлайн

на главную - закладки

Жанры

Графика для Windows средствами DirectDraw

Трухильо Стэн

Шрифт:

 BOOL CreateFPSSurface;

 BOOL UpdateFPSSurface;

private:

 LPDIRECTDRAWSURFACE bmpsurf;

 int x,y;

 int xinc, yinc;

 LPDIRECTDRAWSURFACE modemenusurf;

 int selectmode;

 LPDIRECTDRAWSURFACE ratemenusurf;

 int selectrate;

 int numrates;

 BOOL ratemenu_up;

 LPDIRECTDRAWSURFACE fpssurf;

 RECT fpsrect;

 BOOL displayfps;

 DWORD framecount;

 BOOL include_refresh;

 CArray<DWORD,DWORD> refresh_rates[MAXDISPLAYMODES];

 HFONT smallfont, largefont;

};

Отличия

начинаются с функции OnCreate. Мы переопределяем функцию DirectDrawWin::OnCreate так, чтобы перед инициализацией DirectDraw в ней выводилось диалоговое окно (в котором можно отключить изменение частоты смены кадров).

Другая новая функция — StoreModeInfo. Эта функция косвенного вызова вызывается при составлении списка частот каждого видеорежима. Как говорилось в главе 3, класс DirectDrawWin имеет для этой цели собственную функцию косвенного вызова (DisplayModeAvailable). Вместо того чтобы изменять класс DirectDrawWin, мы воспользуемся функцией StoreModeInfo, приспособленной для целей конкретного приложения. Это означает, что список видеорежимов будет составляться дважды: сначала без частот смены кадров (класс DirectDrawWin), а потом с частотами (класс SuperSwitchWin).

Далее в списке идут четыре новые функции:

• CreateModeMenuSurface

• UpdateModeMenuSurface

• CreateRateMenuSurface

• UpdateRateMenuSurface

Функции CreateModeMenuSurface и UpdateModeMenuSurface — это просто переименованные функции CreateMenuSurface и UpdateMenuSurface из программы Switch. Их пришлось переименовать, потому что теперь существуют две поверхности меню: одна — для видеорежимов, а другая — для частот смены кадров. Функции CreateModeMenuSurface и UpdateModeMenuSurface работают с поверхностью меню видеорежимов. Две новые функции, CreateRateMenuSurface и UpdateRateMenuSurface, предназначены для работы с поверхностью меню частот.

Теперь давайте рассмотрим новые и изменившиеся переменные класса. Указатель menusurf из программы Switch был переименован в modemenusurf по той же причине, по которой были переименованы функции для работы с поверхностью меню видеорежимов. Далее в классе появились шесть новых переменных. Я снова приведу объявления новых переменных класса из листинга 4.6:

LPDIRECTDRAWSURFACE ratemenusurf;

int selectrate;

int numrates;

BOOL ratemenu_up;

BOOL include_refresh;

CArray<DWORD,DWORD> refresh_rates[MAXDISPLAYMODES];

Переменная ratemenusurf представляет собой указатель на интерфейс DirectDrawSurface

и используется для работы с поверхностью меню частот. В целых переменных selectrate и numrates хранятся соответственно текущая выделенная частота и общее количество отображаемых частот. Логическая переменная ratemenu_up показывает, отображается ли меню частот в данный момент.

Значение логической переменной include_refresh определяется выбором пользователя, сделанным в окне диалога при старте программы. Если эта переменная равна TRUE, программа создает и выводит меню со списком частот для каждого выделенного видеорежима. Если переменная равна FALSE, частоты не отображаются. Наконец, массив refresh_rates предназначен для хранения возможных частот каждого видеорежима. Содержимое массива определяется с помощью косвенно вызываемой функции StoreModeInfo и используется функцией UpdateRateMenusurface

Инициализация приложения 

Как упоминалось выше, перед инициализацией DirectDraw программа SuperSwitch выводит в функции SuperSwitchWin::OnCreate диалоговое окно. После вывода диалогового окна функция вызывает версию OnCreate класса DirectDrawWin. Код функции SuperSwitchWin::OnCreate выглядит так:

int SuperSwitchWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {

 IntroDialog introdialog;

 if (introdialog.DoModal!=IDOK) return -1;

 include_refresh=introdialog.include_refresh;

 if (DirectDrawWin::OnCreate(lpCreateStruct)==-1) return -1;

 if (include_refresh) ddraw2->EnumDisplayModes(DDEDM_REFRESHRATES, 0, this, StoreModeInfo);

 return 0;

}

Сначала мы создаем объект класса IntroDialog — этот класс-оболочка был сгенерирован ClassWizard. Диалоговое окно отображается функцией CDialog::DoModal, которая возвращает код IDOK в случае нажатия пользователем кнопки OK. Если пользователь закрывает диалоговое окно другим способом (например, нажимая кнопку Cancel), функция OnCreate возвращает код –1, что для MFC является признаком завершения приложения. Если была нажата кнопка OK, переменной include_refresh присваивается значение в зависимости от состояния флажка в диалоговом окне.

Теперь мы вызываем версию OnCreate класса DirectDrawWin, где и происходит инициализация DirectDraw. Функция составляет список видеорежимов, активизирует исходный режим и создает поверхности приложения. Если вызов функции OnCreate завершается неудачей, мы завершаем приложение, возвращая код –1.

Следующий шаг — повторное составление списка видеорежимов. На этот раз при вызове функции EnumDisplayModes в первом аргументе передается флаг DDEDM_REFRESHRATES, согласно которому каждый видеорежим должен быть включен в список по одному разу для каждой поддерживаемой частоты. В результате мы сможем построить список частот для каждого видеорежима. Четвертый аргумент EnumDisplayModes — функция косвенного вызова StoreModeInfo, которая выглядит так:

Поделиться:
Популярные книги

Семья. Измена. Развод

Высоцкая Мария Николаевна
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Семья. Измена. Развод

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Искушение генерала драконов

Лунёва Мария
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Искушение генерала драконов

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Камень Книга одиннадцатая

Минин Станислав
11. Камень
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Камень Книга одиннадцатая

Никто и звать никак

Ром Полина
Фантастика:
фэнтези
7.18
рейтинг книги
Никто и звать никак

Возвышение Меркурия. Книга 14

Кронос Александр
14. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 14

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Пограничная река. (Тетралогия)

Каменистый Артем
Пограничная река
Фантастика:
фэнтези
боевая фантастика
9.13
рейтинг книги
Пограничная река. (Тетралогия)

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Сумеречный Стрелок 10

Карелин Сергей Витальевич
10. Сумеречный стрелок
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Сумеречный Стрелок 10