Стэн Трухильо - Графика для Windows средствами DirectDraw

Здесь есть возможность читать онлайн «Стэн Трухильо - Графика для Windows средствами DirectDraw» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Графика для Windows средствами DirectDraw: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Графика для Windows средствами DirectDraw»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Графика для Windows средствами DirectDraw — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Графика для Windows средствами DirectDraw», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

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

if (nState!=WA_INACTIVE) {

if (keyboard) {

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

keyboard->Acquire();

}

if (mouse) {

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

mouse->Acquire();

}

}

}

Функция Acquire()вызывается для каждого устройства независимо от того, уступалось ли оно. DirectInput игнорирует лишние вызовы Acquire().

Получение данных от мыши

Хлопоты с инициализацией мыши и клавиатуры закончены, теперь можно получать от них данные. Функция DrawScene()(см. листинг 6.6) через указатели mouseи keyboardобращается к обоим устройствам и получает от них данные.

Листинг 6.6. Функция SmearWin::DrawScene()

void SmearWin::DrawScene() {

static char key[256];

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

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

BOOL done=FALSE;

while (!done) {

DIDEVICEOBJECTDATA data;

DWORD elements=1;

HRESULT r=mouse->GetDeviceData(sizeof(data), &data, &elements, 0);

if (r==DI_OK && elements==1) {

switch(data.dwOfs) {

case DIMOFS_X:

x+=data.dwData;

break;

case DIMOFS_Y:

y+=data.dwData;

break;

}

} else if (elements==0) done=TRUE;

}

BltSurface(primsurf, sphere, x, y, TRUE);

}

Функция DrawScene()сначала проверяет состояние клавиатуры функцией GetDeviceState()интерфейса DirectInputDevice. Если была нажата клавиша Escape, она посылает сообщение WM_CLOSE, что приводит к завершению приложения. О функции GetDeviceState()и проверке состояния клавиш рассказано в программе Qwerty, поэтому сейчас мы займемся кодом, относящимся к мыши. DrawScene()в цикле извлекает элементы буфера мыши. Для получения данных, а также для проверки отсутствия элементов при пустом буфере используется функция GetDeviceData()интерфейса DirectInputDevice.

Каждый элемент буфера представлен структурой DIDEVICEOBJECTDATA. Эта структура используется независимо от типа устройства, поэтому ее поля были сделаны универсальными. DirectInput определяет структуру DIDEVICEOBJECTDATAследующим образом:

typedef struct {

DWORD dwOfs;

DWORD dwData;

DWORD dwTimeStamp;

DWORD dwSequence;

} DIDEVICEOBJECTDATA, *LPDIDEVICEOBJECTDATA;

Для мыши поле dwOfsопределяет тип события. В DirectInput определены следующие константы, описывающие ввод от мыши:

• DIMOFS_X

• DIMOFS_Y

• DIMOFS_Z

• DIMOFS_BUTTON0

• DIMOFS_BUTTON1

• DIMOFS_BUTTON2

• DIMOFS_BUTTON3

Программа Smear реагирует только на перемещение мыши по осям xи y, поэтому после вызова функции GetDeviceData()поле dwOfsсравнивается с константами DIMOFS_Xи DIMOFS_Y.

Поле dwDataопределяет новые значения осевых координат и кнопок. Поскольку мы используем относительные значения, содержимое этого поля равно смещению по данной оси с момента получения последних данных. Следовательно, оно может быть и отрицательным. Поле dwDataиспользуется для обновления переменных xи y.

Поля dwTimeStampи dwSequenceсодержат информацию о том, когда произошло данное событие. Поле dwTimeStampопределяет время в миллисекундах (о том, как интерпретируется эта величина, можно подробно узнать в описании функции Win32 GetTickCount()). Поле dwSequenceопределяет порядок наступления событий. События с меньшими номерами наступили раньше, однако несколько событий могут иметь одинаковые порядковые номера. Например, если мышь или рукоять джойстика смещается по диагонали, события для координат x и y будут иметь одинаковые номера.

Вернемся к функции DrawScene(). Цикл ввода извлекает элементы буфера до тех пор, пока буфер не опустеет. Этот цикл выглядит так:

while (!done) {

DIDEVICEOBJECTDATA data;

DWORD elements=1;

HRESULT r=mouse->GetDeviceData(sizeof(data), &data, &elements, 0);

if (r==DI_OK && elements==1) {

switch (data.dwOfs) {

case DIMOFS_X:

x+=data.dwData;

break;

case DIMOFS_Y:

y+=data.dwData;

break;

}

} else if (elements==0) done=TRUE;

}

Третий аргумент GetDeviceData()используется двояко. Значение, передаваемое функции, определяет количество элементов, извлекаемых из буфера. В нашем случае используется всего одна структура DIDEVICEOBJECTDATA, поэтому передается число 1. При возврате из функции это значение показывает количество полученных элементов.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Графика для Windows средствами DirectDraw»

Представляем Вашему вниманию похожие книги на «Графика для Windows средствами DirectDraw» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Графика для Windows средствами DirectDraw»

Обсуждение, отзывы о книге «Графика для Windows средствами DirectDraw» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x