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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

На этапе 5 мы проверяем очередь событий мыши. Элементы извлекаются из очереди, пока она не опустеет. Координаты левой (нулевой) кнопки мыши сохраняются для дальнейшего использования.

На этапе 6 в программе происходит необязательная задержка, выполняемая функцией Sleep()(функция Sleep()блокирует вызвавший поток на заданное количество миллисекунд). Задержка определяется текущей выделенной строкой меню задержек, она имитирует сильную загрузку процессора основным потоком. Например, при воспроизведении сложной трехмерной сцены частота вывода кадров падает. Задержка показывает, что скорость реакции нашего курсора не зависит от частоты генерации кадров.

Этап 6 не требует синхронизации, поэтому мы вызываем функцию CCriticalSection::Unlock(). Если к этому моменту поток ввода был заблокирован и ожидал доступа к своей критической секции, вызов Unlock()позволит ему войти в нее.

На этапе 7 обновляется поверхность меню задержки — хороший пример кода, который следовало бы спрятать в отдельном классе управления меню. Но, как уже говорилось в этой главе, я решил сократить количество функций и классов в этой программе, поэтому большая часть кода осталась «сырой». Так или иначе, на этапе 7 мы проверяем координаты последнего нажатия левой кнопки мыши и в соответствии с ними обновляем меню.

Теперь мы знаем, как происходит обновление экрана в основном потоке. Давайте посмотрим, как работает поток ввода.

Поток ввода

Если не считать двух вспомогательных функций, весь поток ввода реализован в виде одной функции. Функция MouseThread()приведена в листинге 7.5.

Листинг 7.5. Функция MouseThread()

DWORD CursorWin::MouseThread(LPVOID p) {

TRACE("starting mouse thread\n");

CursorWin* win=(CursorWin*)p;

while(TRUE) {

CMultiLock mlock((CSyncObject**)mouse_event, 2);

DWORD event=mlock.Lock(INFINITE, FALSE);

if (event-WAIT_OBJECT_0==quit_event_index) {

TRACE("got quit message: quitting mouse thread\n");

return 0;

}

critsection.Lock();

oldcurx=curx;

oldcury=cury;

BOOL buffer_empty=FALSE;

while (!buffer_empty) {

DIDEVICEOBJECTDATA data;

DWORD elements=1;

if (mouse==0) {

TRACE("invalid pointer: quitting mouse thread\n");

return 0;

}

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

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

static MouseClickData mc;

switch data.dwOfs) {

case DIMOFS_X:

curx+=data.dwData;

break;

case DIMOFS_Y:

cury+=data.dwData;

break;

case DIMOFS_BUTTON0:

if (data.dwData & 0x80) {

mc.x=curx;

mc.y=cury;

mc.button=0;

mouseclickqueue.AddHead(mc);

}

break;

case DIMOFS_BUTTON1:

if (data.dwData & 0x80) {

mc.x=curx;

mc.y=cury;

mc.button=1;

mouseclickqueue.AddHead(mc);

}

break;

}

} else buffer_empty=TRUE;

}

if (curx<0) curx=0;

if (cury<0) cury=0;

if (curx>=screen_width-cursor_width) curx=screen_width-cursor_width-1;

if (cury>=screen_height-cursor_height) cury=screen_height-cursor_height-1;

if (curx==oldcurx && cury==oldcury) {

//----- обновление курсора не требуется ------

goto nevermind;

} else if (abs(curx-oldcurx) >= cursor_width || abs(cury-oldcury) >= cursor_height) {

//----- простой случай: прямоугольники нового

// и старого курсора не перекрываются -----

win->UpdateCursorSimpleCase(curx, cury, oldcurx, oldcury);

} else {

//----- сложный случай: прямоугольники нового

// и старого курсора перекрываются -----

win->UpdateCursorComplexCase(curx, cury, oldcurx, oldcury);

}

nevermind:;

critsection.Unlock();

}

TRACE("leaving mouse thread\n");

return 0;

};

Функция MouseThread()имеет один параметр — значение, передаваемое функции AfxBeginThread()при создании потока (см. листинг 7.3). Мы передавали указатель this, поэтому сейчас сможем присвоить его значение указателю на класс CursorWin(переменная win). В функции MouseThread()указатель winбудет использоваться для доступа к членам класса CursorWin.

Функция MouseThread()в цикле выполняет блокировку по двум событиям. Класс CMultiLockпозволяет блокироваться как по событиям от мыши, так и по событию завершения потока. Фактическая блокировка выполняется функцией CMultiLock::Lock(). По умолчанию функция Lock()блокирует поток до установки всех (в данном случае - двух) заданных событий. Мы изменяем это поведение и передаем FALSEв качестве второго аргумента Lock(), показывая тем самым, что функция должна снимать блокировку при установке хотя бы одного из этих событий.

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

Интервал:

Закладка:

Сделать

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

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


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

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

x