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

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

Жанры

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

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

Шрифт:

Затем мы задаем уровень кооперации устройства с помощью функции SetCooperativeLevel интерфейса DirectInputDevice. Соответствующий фрагмент листинга 6.2 выглядит так:

r=keyboard->SetCooperativeLevel(GetSafeHwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);

Функция SetCooperativeLevel получает два аргумента: логический номер окна и набор флагов, определяющих уровень кооперации. Функция GetSafeHwnd определяет логический номер окна, а флаги DISCL_FOREGROUND и DISCL_NONEXCLUSIVE задают нужный уровень кооперации. Флаг активного

режима DISCL_FOREGROUND присутствует потому, что на время активности другого приложения нам не потребуется ввод от клавиатуры, а флаг DISCL_NONEXCLUSIVE — потому, что DirectInput не позволяет установить монопольный доступ к клавиатуре.

До получения данных с клавиатуры остался всего один шаг: мы должны захватить устройство функцией Acquire. Эта задача решается функцией OnActivate, которую мы рассмотрим ниже.

Функция QwertyWin::OnCreate завершается вызовом функции DirectDrawWin::OnCreate, инициализирующей DirectDraw. Эта функция обсуждалась в главе 3.

Захват клавиатуры

Итак, мы инициализировали DirectInput и подготовили клавиатуру к работе; теперь необходимо захватить ее. Для этой цели используется функция OnActivate, потому что клавиатуру приходится захватывать при каждой активизации нашего приложения. Функция OnActivate выглядит так:

void QwertyWin::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) {

 DirectDrawWin::OnActivate(nState, pWndOther, bMinimized);

 if (nState!=WA_INACTIVE && keyboard) {

TRACE("keyboard->Acquire\n");

keyboard->Acquire;

 }

}

После вызова версии OnActivate базового класса мы проверяем, происходит ли активизация приложения (функция OnActivate вызывается и в случае деактивизации, когда активным становится другое приложение). Если проверка дает положительный результат, мы вызываем функцию Acquire интерфейса DirectInputDevice.

Перед вызовом Acquire можно проверить, не была ли клавиатура захвачена ранее, но в этом нет необходимости. DirectInput игнорирует лишние вызовы функции Acquire.

Определение состояния клавиш

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

Листинг 6.3. Функция QwertyWin::DrawScene

void QwertyWin::DrawScene {

 static char key[256];

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

 //---------- Клавиши QWERTY --------

 if (key[DIK_Q] & 0x80) BltSurface(backsurf, q_dn, 213, 70);

 else BltSurface(backsurf, q_up, 213, 70);

 if (key[DIK_W] & 0x80) BltSurface(backsurf, w_dn, 251, 70);

 else BltSurface(backsurf, w_up, 251, 70);

 if (key[DIK_E] & 0x80) BltSurface(backsurf, e_dn, 298, 70);

 else BltSurface(backsurf, e_up, 298, 70);

 if (key[DIK_R] & 0x80) BltSurface(backsurf, r_dn, 328, 70);

 else BltSurface(backsurf, r_up, 328, 70);

 if (key[DIK_T] & 0x80) BltSurface(backsurf, t_dn, 361, 70);

 else BltSurface(backsurf, t_up, 361, 70);

 if (key[DIK_Y] & 0x80) BltSurface(backsurf, y_dn, 393, 70);

 else BltSurface(backsurf, y_up, 393, 70);

 //---------------- LEFT CONTROL ---------------

 if (key[DIK_LCONTROL] & 0x80) BltSurface(backsurf, lctrl_dn, 50, 180);

 else BltSurface(backsurf, lctrl_up, 49, 180);

 //---------------- RIGHT CONTROL ---------------

 if (key[DIK_RCONTROL] & 0x80) BltSurface(backsurf, rctrl_dn, 490, 180);

 else BltSurface(backsurf, rctrl_up, 490, 180);

 //---------------- LEFT ALT ---------------

 if (key[DIK_LMENU] & 0x80) BltSurface(backsurf, lalt_dn, 100, 260);

 else BltSurface(backsurf, lalt_up, 100, 260);

 //---------------- RIGHT ALT ---------------

 if (key[DIK_RMENU] & 0x80) BltSurface(backsurf, ralt_dn, 440, 260);

 else BltSurface(backsurf, ralt_up, 440, 260);

 //---------------- SPACE -----------------

 if (key[DIK_SPACE] & 0x80) BltSurface(backsurf, space_dn, 170, 340);

 else BltSurface(backsurf, space_up, 170, 340);

 //---------- ESCAPE -------------

 if (key[DIK_ESCAPE] & 0x80) {

BltSurface(backsurf, esc_dn, 0, 0);

esc_pressed=TRUE;

 } else {

BltSurface(backsurf, esc_up, 0, 0);

if (esc_pressed) PostMessage(WM_CLOSE);

 }

 primsurf->Flip(0, DDFLIP_WAIT);

}

Состояние

устройства определяется функцией GetDeviceState интерфейса DirectInputDevice. Тип и размер второго аргумента GetDeviceState зависят от типа устройства, а также от формата данных, заданного функцией SetDataFormat. Для клавиатуры функция должна получать массив из 256 байт, где каждый байт соответствует одной клавише. В DirectInput предусмотрен набор клавиатурных констант, которые используются как индексы массива и позволяют ссылаться на нужные клавиши. DirectInput обозначает нажатие клавиши установкой старшего бита того байта, который представляет данную клавишу. Объявление массива и вызов функции GetDeviceState находятся в верхней части листинга 6.3, я снова привожу их:

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

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

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
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
рейтинг книги
Я – Легенда