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

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

Жанры

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

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

Шрифт:

Первый аргумент AfxBeginThread — указатель на функцию, выполняемую новым потоком; в нашем случае используется функция MouseThread. Второй аргумент — значение, которое передается функции потока при вызове. Мы передаем указатель this, чтобы функция MouseThread могла обращаться к членам нашего класса.

Третий аргумент — приоритет потока. По умолчанию для потока устанавливается нормальный приоритет (флаг THREAD_PRIORITY_NORMAL), но мы переопределяем его и задаем флаг THREAD_PRIORITY_TIME_CRITICAL,

чтобы добиться наискорейшего отклика курсора.

Четвертый аргумент — размер стека для нового потока. Ноль означает, что размер стека выбирается по умолчанию. Пятый и последний аргумент определяет исходное состояние потока. Если он равен нулю, создается активный поток; в нашем случае использован флаг CREATE_SUSPENDED, чтобы создавался приостановленный поток.

На создании потока ввода работа функции InitMouse заканчивается. Благодаря флагу CREATE_SUSPENDED поток ввода приостанавливается до момента, когда основной поток завершит инициализацию DirectDraw. Затем, перед возвратом из функции OnCreate, поток ввода активизируется функцией ResumeThread (см. листинг 7.2).

Функция DrawScene 

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

Листинг 7.4. Функция DrawScene

void CursorWin::DrawScene {

 //------ Проверить клавишу ESCAPE -------

 static char key[256];

 keyboard->GetDeviceState(sizeof(key), &key);

 if (key[DIK_ESCAPE] & 0x80) PostMessage(WM_CLOSE);

 //------ Обычные задачи ------

 ClearSurface(backsurf, 0);

 BltSurface(backsurf, dm_surf, 539, 0);

 static coil_idx;

 BltSurface(backsurf, coil[coil_idx], coilx, coily);

 coil_idx=(coil_idx+1)%coil_frames;

 //------ Начало синхронизированной секции ------

 critsection.Lock;

 //------ Сохранить область вторичного буфера под курсором

 RECT src;

 src.left=curx;

 src.top=cury;

 src.right=curx+cursor_width;

 src.bottom=cury+cursor_height;

 cursor_under->BltFast(0, 0, backsurf, &src, DDBLTFAST_WAIT);

 //------ Нарисовать курсор во вторичном буфере

 backsurf->BltFast(curx, cury, cursor, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);

 primsurf->Flip(0, DDFLIP_WAIT);

 while (primsurf->GetFlipStatus(DDGFS_ISFLIPDONE)!=DD_OK);

 //
ничего не делать (ждать, пока закончится

 // переключение страниц)

 int x, y;

 BOOL newclick=FALSE;

 int count=mouseclickqueue.GetCount;

 while (count--) {

MouseClickData mc=mouseclickqueue.RemoveTail;

if (mc.button==0) {

x=mc.x;

y=mc.y;

newclick=TRUE;

}

 }

 critsection.Unlock;

 //------ Конец синхронизированной секции -------

 //------ Сделать паузу в соответствии с выбранной задержкой ----

 if (delay_value[dm_index]!=0) Sleep(delay_value[dm_index]);

 //------ Обновить меню задержки --------

 if (newclick) {

int max_index=sizeof(delay_value)/sizeof(int)-1;

int menux=screen_width-dm_width+dm_margin;

int menuw=dm_width-dm_margin*2;

if (x>=menux && x<=menux+menuw) {

int index=(y-dm_header)/dm_entrysize;

if (index>=0 && index<=max_index && index!=dm_index) {

dm_index=index;

UpdateDelaySurface;

}

}

 }

}

Функция DrawScene состоит из семи этапов:

1. Проверка клавиши Escape.

2. Подготовка нового кадра во вторичном буфере.

3. Обновление курсора (также во вторичном буфере).

4. Переключение страниц.

5. Проверка очереди событий мыши.

6. Проверка очереди событий мыши.

7. Обновление поверхности меню задержки.

Первый этап выполняется функцией GetDeviceState интерфейса DirectInputDevice. Если будет обнаружено нажатие клавиши Escape, функция посылает сообщение WM_CLOSE, сигнализируя о завершении приложения.

Подготовка вторичного буфера (этап 2) включает его стирание и последующее копирование в него внеэкранной поверхности. Для перебора поверхностей из массива coil используется статическая целая переменная (массив coil подготавливается функцией CustomSurfaces, которую мы не рассматриваем).

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

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Император

Рави Ивар
7. Прометей
Фантастика:
фэнтези
7.11
рейтинг книги
Император

Книга 4. Игра Кота

Прокофьев Роман Юрьевич
4. ОДИН ИЗ СЕМИ
Фантастика:
фэнтези
боевая фантастика
рпг
6.68
рейтинг книги
Книга 4. Игра Кота

Род Корневых будет жить!

Кун Антон
1. Тайны рода
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Род Корневых будет жить!

Царев врач, или Когда скальпель сильнее клинка

Сапаров Александр Юрьевич
1. Царев врач
Фантастика:
попаданцы
альтернативная история
8.77
рейтинг книги
Царев врач, или Когда скальпель сильнее клинка

Под маской моего мужа

Рам Янка
Любовные романы:
современные любовные романы
5.67
рейтинг книги
Под маской моего мужа

Пять попыток вспомнить правду

Муратова Ульяна
2. Проклятые луной
Фантастика:
фэнтези
эпическая фантастика
5.00
рейтинг книги
Пять попыток вспомнить правду

Курсант: Назад в СССР 7

Дамиров Рафаэль
7. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 7

Пышка и Герцог

Ордина Ирина
Фантастика:
юмористическое фэнтези
историческое фэнтези
фэнтези
5.00
рейтинг книги
Пышка и Герцог

Все ведьмы – стервы, или Ректору больше (не) наливать

Цвик Катерина Александровна
1. Все ведьмы - стервы
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Все ведьмы – стервы, или Ректору больше (не) наливать

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

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

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

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

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

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

Котенок. Книга 3

Федин Андрей Анатольевич
3. Котенок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Котенок. Книга 3