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

Тут можно читать онлайн Стэн Трухильо - Графика для Windows средствами DirectDraw - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика для Windows средствами DirectDraw
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4.88/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

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

Графика для Windows средствами DirectDraw - описание и краткое содержание, автор Стэн Трухильо, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

Графика для Windows средствами DirectDraw - читать книгу онлайн бесплатно, автор Стэн Трухильо
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

return -1;

}

if (InitMouse()==FALSE) return -1;

if (InitKeyboard()==FALSE) return -1;

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

mousethread->ResumeThread();

return 0;

}

Сначала OnCreate()инициализирует DirectInput функцией DirectInputCreate(). Затем мышь и клавиатура инициализируются функциями InitMouse()и InitKeyboard(), после чего вызывается функция DirectDrawWin::OnCreate(). Функция InitMouse(), которую мы рассмотрим чуть ниже, создает поток ввода, доступ к которому осуществляется через указатель mousepointer. Однако поток ввода создается в приостановленном состоянии, чтобы он не пытался преждевременно обращаться к первичной поверхности. Поток будет запущен лишь после инициализации DirectDraw. Приостановленный поток активизируется функцией CWinThread::ResumeThread().

Давайте рассмотрим функцию InitMouse(), чтобы получить общее представление об инициализации мыши и создании потока ввода. Функция InitMouse()приведена в листинге 7.3.

Листинг 7.3. Функция InitMouse()

BOOL CursorWin::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);

if (r!=DI_OK) {

TRACE("mouse->SetProperty() failed (buffersize)\n");

return FALSE;

}

mouse_event[mouse_event_index]=new CEvent;

mouse_event[quit_event_index]=new CEvent;

r = mouse->SetEventNotification(*mouse_event[mouse_event_index]);

if (r!=DI_OK) {

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

return FALSE;

}

mousethread=AfxBeginThread((AFX_THREADPROC)MouseThread, this, THREAD_PRIORITY_TIME_CRITICAL, 0, CREATE_SUSPENDED);

return TRUE;

}

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

1. Инициализация устройства DirectInput, которое представляет мышь.

2. Выбор формата данных, получаемых от мыши.

3. Установка уровня кооперации для мыши.

4. Инициализация буфера данных мыши.

5. Создание двух объектов CEvent.

6. Инициализация механизма оповещений DirectInput.

7. Создание потока ввода.

На этапах 1-4 происходит нормальная инициализация DirectInput, подробно рассмотренная в главе 6, поэтому основное внимание будет уделено этапам 5, 6 и 7.

На этапе 5 создаются два динамических объекта CEvent, а полученные указатели сохраняются в маленьком массиве. Положение этих указателей в массиве определяется константами mouse_event_indexи quit_event_index(которые равны 0 и 1 соответственно). Первое событие блокирует или активизирует поток ввода в зависимости от того, поступили ли от мыши новые данные. Второе событие сообщает потоку мыши о завершении приложения. Как мы вскоре увидим, указатели сохраняются в массиве для того, чтобы мы могли заблокировать поток мыши по двум событиям одновременно.

На этапе 6 функция SetEventNotification()интерфейса DirectInputDeviceприказывает DirectInput устанавливать событие мыши при появлении новых данных. Функция SetEventNotification()получает один аргумент типа HANDLE, однако наш объект CEventнаследует оператор преобразования типа от класса CSyncObject, благодаря чему мы можем использовать объект CEventтак, словно он имеет тип HANDLE(тип HANDLE, в частности, используется потоковым API Win32 для представления событий).

На этапе 7 создается поток ввода от мыши. Я снова приведу соответствующий фрагмент листинга 7.2:

mousethread=AfxBeginThread((AFX_THREADPROC)MouseThread, this, THREAD_PRIORITY_TIME_CRITICAL, 0, CREATE_SUSPENDED);

Существуют и другие способы создания потоков, но функция AfxBeginThread()является самым простым вариантом. Она получает шесть аргументов, однако последние четыре имеют значения по умолчанию, так что обязательными являются лишь два аргумента. В нашем случае передается пять аргументов.

Первый аргумент 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);

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

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

Интервал:

Закладка:

Сделать


Стэн Трухильо читать все книги автора по порядку

Стэн Трухильо - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Графика для Windows средствами DirectDraw, автор: Стэн Трухильо. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x