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

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

Жанры

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

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

Шрифт:

Вызов функции FlipToGDISurface гарантирует, что вывод GDI будет присутствовать на экране. Кроме того, мы включаем курсор мыши (отключенный при запуске приложения классом DirectDrawWin), чтобы для работы с диалоговым окном можно было пользоваться мышью.

Далее мы создаем экземпляр класса BmpDialog, если он не был создан ранее. Класс-оболочка BmpDialog создается ClassWizard, он предназначен для отображения диалогового окна и работы с ним. Класс содержит код для работы с управляющими элементами окна и реакции на действия пользователя. Код класса BmpDialog здесь не рассматривается, так как он не имеет никакого отношения к DirectDraw.

Обратите

внимание: при создании диалогового окна мы вызываем функцию SetArrays и передаем ей массивы palettemode и nonpalettemode в качестве аргументов. Эта функция передает диалоговому окну информацию о видеорежимах, предназначенных для отображения как палитровых, так и беспалитровых изображений.

Диалоговое окно отображается функцией DoModal. Пользователь сможет нажать кнопку Display лишь после того, как будет выбран BMP-файл и видеорежим. При этом мы сохраняем имя и путь выбранного BMP-файла и определяем параметры выбранного видеорежима. Если же пользователь закрывает диалоговое окно, мы посылаем сообщение WM_CLOSE и выходим из функции, завершая приложение.

Наконец, функция ActivateDisplayMode активизирует выбранный видеорежим, функция LoadBmp загружает содержимое BMP-файла, а курсор мыши отключается.

Чтобы лучше понять, как происходит загрузка файла, необходимо рассмотреть функцию LoadBmp, которая не только загружает BMP-файл, но и инициализирует механизм прокрутки. Функция LoadBmp приведена в листинге 5.8.

Листинг 5.8. Функция LoadBmp

BOOL BmpViewWin::LoadBmp {

 CWaitCursor cur;

 LPDIRECTDRAWSURFACE surf;

 surf=CreateSurface(filename, TRUE);

 if (surf) {

if (bmpsurf) bmpsurf->Release;

bmpsurf=surf;

 } else {

TRACE("failed to load new file\n");

return FALSE;

 }

 displayrect=GetDisplayRect;

 TRACE("display: %d %d\n", displayrect.right, displayrect.bottom);

 GetSurfaceRect(bmpsurf, bmprect);

 TRACE("surface: %d %d\n", bmprect.right, bmprect.bottom);

 int mx = displayrect.Width-bmprect.Width;

 if (mx<0) {

xscroll=TRUE;

xlimit=mx;

x=0;

 } else {

xscroll=FALSE;

x=mx/2;

 }

 int my = displayrect.Height-bmprect.Height;

 if (my<0) {

yscroll=TRUE;

ylimit=my;

y=0;

 } else {

yscroll=FALSE;

y=my/2;

 }

 update_screen=TRUE;

 return TRUE;

}

Сначала функция LoadBmp создает объект MFC CWaitCursor,

чтобы на время ее работы на экране отображался курсор Windows в виде песочных часов. Затем она вызывает функцию CreateSurface и передает ей в качестве аргумента имя выбранного BMP-файла. Реализация CreateSurface рассматривалась ранее в этой главе, поэтому мы знаем, что эта функция загружает указанный BMP-файл на новую поверхность.

Затем LoadBmp определяет параметры новой поверхности и текущий активный видеорежим и использует полученные данные для инициализации переменных класса BmpViewWin, связанных с прокруткой и позиционированием поверхностей. Если размеры поверхности меньше размеров видеорежима, поверхность центрируется на экране; если поверхность больше, следует разрешить ее прокрутку. Переменные x и y определяют текущую позицию на поверхности, а переменные xlimit и ylimit ограничивают диапазон прокрутки. Логические переменные xscroll и yscroll показывают, разрешена ли горизонтальная и вертикальная прокрутка поверхности.

Наконец, логической переменной update_screen присваивается значение TRUE; оно говорит о том, что функция DrawScene должна обновить первичную поверхность. О функции DrawScene речь пойдет в следующем разделе. 

Графический вывод 

Функция DrawScene обновляет экран в зависимости от состояния логической переменной update_screen. Если переменная update_screen равна FALSE, предполагается, что содержимое первичной поверхности не устарело, и делать ничего не нужно. Функция DrawScene выглядит так:

void BmpViewWin::DrawScene {

 if (update_screen && bmpsurf) {

ClearSurface(backsurf, 0);

BltSurface(backsurf, bmpsurf, x, y);

primsurf->Flip(0, DDFLIP_WAIT);

update_screen=FALSE;

 }

}

Поскольку текущее положение поверхности рассчитывается в другом месте программы, а функция BltSurface при необходимости автоматически выполняет отсечение, функция DrawScene реализуется просто. Если переменная update_screen равна TRUE и существует поверхность для вывода, экран обновляется. Если поверхность не заполняет экран целиком, содержимое вторичного буфера стирается; если заполняет, то в стирании буфера нет необходимости. Затем функция BltSurface копирует поверхность на вторичный буфер, а функция Flip отображает изменения на экране. После того как обновление будет завершено, переменной update_screen присваивается значение FALSE

Обработка пользовательского ввода 

Давайте посмотрим, как в нашей программе организована обработка ввода. Нажатые клавиши обрабатываются функций OnKeyDown, которая выглядит так:

void BmpViewWin::OnKeyDown(UINT key, UINT nRepCnt, UINT nFlags) {

 switch (key) {

 case VK_UP:

Up;

break;

 case VK_DOWN:

Down;

break;

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

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Последняя Арена 11

Греков Сергей
11. Последняя Арена
Фантастика:
фэнтези
боевая фантастика
рпг
5.00
рейтинг книги
Последняя Арена 11

Ученик. Книга третья

Первухин Андрей Евгеньевич
3. Ученик
Фантастика:
фэнтези
7.64
рейтинг книги
Ученик. Книга третья

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

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

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Барон Дубов

Карелин Сергей Витальевич
1. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов

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

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

Мастер 8

Чащин Валерий
8. Мастер
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Мастер 8

Кодекс Крови. Книга VI

Борзых М.
6. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VI

Кодекс Охотника. Книга VII

Винокуров Юрий
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Кодекс Охотника. Книга VII

Демон Системы. Часть 2

Poul ezh
4. Пехотинец Системы
Фантастика:
попаданцы
фэнтези
фантастика: прочее
5.00
рейтинг книги
Демон Системы. Часть 2

Дорога к счастью

Меллер Юлия Викторовна
Любовные романы:
любовно-фантастические романы
6.11
рейтинг книги
Дорога к счастью

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

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

Я – Легенда

Гарцевич Евгений Александрович
1. Я - Легенда!
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
5.00
рейтинг книги
Я – Легенда