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

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

Жанры

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

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

Шрифт:
Класс SmearWin

Основная функциональность программы Smear обеспечивается классом SmearWin (см. листинг 6.4).

Листинг 6.4. Класс SmearWin

class SmearWin : public DirectDrawWin {

public:

 SmearWin;

protected:

 //{{AFX_MSG(SmearWin)

 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

 afx_msg void OnDestroy;

 afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);

 //}}AFX_MSG

 DECLARE_MESSAGE_MAP

private:

 BOOL CreateFlippingSurfaces;

private:

 int SelectDriver;

 int SelectInitialDisplayMode;

 BOOL CreateCustomSurfaces;

 void DrawScene;

 void RestoreSurfaces;

private:

 BOOL InitKeyboard;

 BOOL InitMouse;

private:

 LPDIRECTINPUT dinput;

 LPDIRECTINPUTDEVICE mouse;

 LPDIRECTINPUTDEVICE keyboard;

 LPDIRECTDRAWSURFACE sphere;

 int x, y;

};

В

классе объявлены три обработчика:

• OnCreate

• OnDestroy

• OnActivate

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

Затем следует переопределенная функция DirectDrawWin::CreateFlippingSurfaces. Нам не нужна переключаемая первичная поверхность, которая по умолчанию предоставляется классом DirectDrawWin, поэтому мы переопределяем эту функцию и создаем первичную поверхность, неспособную к переключению страниц.

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

Затем класс SmearWin объявляет функции InitMouse и InitKeyboard. Функция OnCreate возлагает на них ответственность за инициализацию устройств.

Наконец, мы объявляем несколько переменных. Переменная dinput — указатель на интерфейс DirectInput, она используется для работы с DirectInput после инициализации. Переменные mouse и keyboard указывают на интерфейсы DirectInputDevice, они инициализируются функциями InitMouse и InitKeyboard соответственно. Указатель на поверхность sphere и целые переменные x и y предназначены для вывода и позиционирования

единственной поверхности приложения.

Инициализация DirectInput

Функция OnCreate инициализирует DirectInput, а затем инициализирует мышь и клавиатуру функциями InitMouse и InitKeyboard. Она выглядит так:

int SmearWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {

 HRESULT r=DirectInputCreate(AfxGetInstanceHandle, DIRECTINPUT_VERSION, &dinput, 0);

 if (r!=DI_OK) {

AfxMessageBox("DirectInputCreate failed");

return -1;

 }

 if (InitMouse==FALSE) return -1;

 if (InitKeyboard==FALSE) return -1;

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

 return 0;

}

DirectInput инициализируется функцией DirectInputCreate. При успешном вызове в переменную dinput заносится указатель на созданный объект DirectInput. Остальные аргументы DirectInputCreate рассматривались в программе Qwerty.

Затем мы вызываем функции, которые инициализируют мышь и клавиатуру. Они рассматриваются ниже. Функция OnCreate завершается вызовом версии OnCreate базового класса, инициализирующим DirectDraw.

Инициализация мыши

Функция InitMouse (см. листинг 6.5) готовит мышь к работе.

Листинг 6.5. Функция InitMouse

BOOL SmearWin::InitMouse {

 HRESULT r;

 r = dinput->CreateDevice(GUID_SysMouse, &mouse, 0);

 if (r!=DI_OK) {

TRACE("CreateDevice(mouse) failed\n");

return FALSE;

 }

 r = mouse->SetDataFormat(&c_dfDIMouse);

 if (r!=DI_OK) {

TRACE("mouse->SetDataFormat failed\n");

return FALSE;

 }

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

 if (r!=DI_OK) {

TRACE("mouse->SetCooperativeLevel failed\n");

return FALSE;

 }

 DIPROPDWORD property;

 property.diph.dwSize=sizeof(DIPROPDWORD);

 property.diph.dwHeaderSize=sizeof(DIPROPHEADER);

 property.diph.dwObj=0;

 property.diph.dwHow=DIPH_DEVICE;

 property.dwData=64;

 r = mouse->SetProperty(DIPROP_BUFFERSIZE, &property.diph);

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

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

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