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

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

Жанры

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

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

Шрифт:

 void PageUp;

 void PageDown;

 void Home;

 void End;

 void Left(int inc=4);

 void Right(int inc=4);

 void Up(int inc=4);

 void Down(int inc=4);

private:

 BmpDialog* bmpdialog;

 LPDIRECTDRAWPALETTE syspal;

 CString fullfilename;

 CString filename;

 CString pathname;

 CRect displayrect;

 LPDIRECTDRAWSURFACE bmpsurf;

 CRect bmprect;

 int x,y;

 int xscroll, yscroll;

 int xlimit, ylimit;

 BOOL update_screen;

 DisplayModeArray palettemode, nonpalettemode;

};

Единственной

открытой (public) функцией класса является конструктор, используемый для инициализации переменных. Далее мы объявляем четыре обработчика сообщений:

• OnKeyDown

• OnRButtonDown

• OnCreate

• OnDestroy

Функция OnKeyDonw обрабатывает нажатия нескольких клавиш, среди которых клавиши со стрелками, Home, End, Page Up, Page Down, Enter, пробел и Escape.

Функции OnCreate и OnDestroy предназначены соответственно для инициализации и освобождения структур данных приложения. В частности, функция OnCreate создает диалоговое окно для выбора BMP-файла, а функция OnDestroy уничтожает его.

Далее следуют объявления нескольких закрытых переменных. Функция SelectInitialDisplayMode похожа на версию, созданную DirectDraw AppWizard и использованную в прошлых программах, но в нее внесены некоторые изменения. Кроме выбора исходного видеорежима, эта функция сохраняет текущую палитру Windows с помощью функции GetSystemPalette (которая объявляется несколькими строками ниже функции SelectInitialDisplayMode).

Функция CreateCustomSurfaces объявляется и определяется в объявлении класса. В отличие от других программ, рассмотренных нами, BmpView не отображает никаких вспомогательных поверхностей, поэтому эта функция не делает ничего. Однако из-за того, что функция DirectDrawWin::CreateCustomSurfaces является чисто виртуальной, нам приходится объявить и определить ее минимальную реализацию.

Функция DrawScene отвечает за графический вывод и переключение страниц. Поскольку нашей программе незачем постоянно обновлять экран, функция DrawScene делает это лишь в ответ на пользовательский ввод. Этим она отличается от других программ, в которых экран обновлялся непрерывно. Функция RestoreSurfaces восстанавливает поверхности в случае их потери.

Функция ShowDialog выводит диалоговое окно для выбора BMP-файла. Функция LoadBmp по имени, полученному из диалогового окна, загружает BMP-файл

на поверхность и инициализирует переменные x, y, xscroll, yscroll, xlimit и ylimit. Эти переменные предназначены для позиционирования поверхности в случае, если размер поверхности BMP-файла превышает размеры первичной поверхности.

Затем мы объявляем восемь функций, вызываемых при нажатии конкретных клавиш:

• PageUp

• PageDown

• Home

• End

• Left

• Right

• Up

• Down

Класс содержит несколько переменных, часть из которых упоминалась выше. Их назначение рассматривается при описании функций. 

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

Перед тем как инициализировать DirectDraw, класс DirectDrawWin вызывает функцию SelectDriver, чтобы производные классы могли выбрать драйвер DirectDraw при наличии нескольких вариантов. В программе BmpView мы отказываемся от этой возможности и позволяем выбрать первичный драйвер по умолчанию. Это сделано потому, что для вывода диалоговых окон используется механизм GDI, а GDI может выводить только на первичное видеоустройство (которому соответствует первичный драйвер DirectDraw).

Следующим этапом инициализации приложения является вызов функции SelectInitialDisplayMode, которую мы обязаны переопределить. Наша версия SelectInitialDisplayMode выбирает видеорежим с параметрами 640x480x16. Исходный видеорежим не так уж важен, потому что он, скорее всего, будет переопределен пользователем при выборе BMP-файла. Однако функция SelectInitialDisplayMode (см. листинг 5.6) выполняет две дополнительные задачи.

Листинг 5.6. Функция BmpViewWin::SelectInitialDisplayMode

int BmpViewWin::SelectInitialDisplayMode {

 DisplayModeDescription desc;

 int i, nummodes=GetNumDisplayModes;

 DWORD w,h,d;

 for (i=0;i<nummodes;i++) {

GetDisplayModeDimensions(i, w, h, d);

desc.w=w;

desc.h=h;

desc.d=d;

desc.desc.Format("%dx%dx%d", w, h, d );

if (d==8) palettemode.Add(desc);

else nonpalettemode.Add(desc);

 }

 DWORD curdepth=GetDisplayDepth;

 for (i=0;i>nummodes;i++) {

GetDisplayModeDimensions(i, w, h, d);

if (w==640 && h==480 && d==curdepth) return i;

 }

 for (i=0;i<nummodes;i++) {

GetDisplayModeDimensions(i, w, h, d);

if (d==curdepth) return i;

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

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

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

Хозяйка лавандовой долины

Скор Элен
2. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Хозяйка лавандовой долины

Имя нам Легион. Том 5

Дорничев Дмитрий
5. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 5

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Сколько стоит любовь

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.22
рейтинг книги
Сколько стоит любовь

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Адвокат Империи 3

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

Господин моих ночей (Дилогия)

Ардова Алиса
Маги Лагора
Любовные романы:
любовно-фантастические романы
6.14
рейтинг книги
Господин моих ночей (Дилогия)

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4

Комендант некромантской общаги 2

Леденцовская Анна
2. Мир
Фантастика:
юмористическая фантастика
7.77
рейтинг книги
Комендант некромантской общаги 2

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Надуй щеки! Том 7

Вишневский Сергей Викторович
7. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 7

Командир Красной Армии

Поселягин Владимир Геннадьевич
1. Командир Красной Армии
Фантастика:
попаданцы
8.72
рейтинг книги
Командир Красной Армии