Стэн Трухильо - Графика для 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 - читать книгу онлайн бесплатно, автор Стэн Трухильо
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать
Инициализация мыши

Функция 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);

if (r!=DI_OK) {

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

return FALSE;

}

return TRUE;

}

Функция InitMouse()включает в себя четыре этапа:

1. Создание объекта DirectInputDevice, представляющего мышь.

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

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

4. Инициализацию буфера данных устройства.

Функция CreateDevice()интерфейса DirectInput(первый этап) создает экземпляр интерфейса DirectInputDevice, представляющего системную мышь:

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

DirectInput предоставляет константу GUID_SysMouse, поэтому для получения нужного GUID можно обойтись без составления списка системных устройств. Если приложение должно поддерживать аппаратные конфигурации, в которых используется более одной мыши, придется вызывать функцию EnumDevices().

Если вызов функции CreateDevice()прошел успешно, переменной mouseприсваивается указатель на созданный объект DirectInputDevice. Третий аргумент должен быть равен нулю, если только вы не пользуетесь агрегированием COM.

На втором этапе функция SetDataFormat()интерфейса DirectInputDeviceсообщает DirectInput формат ожидаемых данных:

r = mouse->SetDataFormat(&c_dfDIMouse);

В DirectInput предусмотрен формат c_dfDIMouseдля стандартных данных мыши, поэтому эта задача оказывается простой. DirectInput также содержит форматы данных для клавиатур и джойстиков, так что в большинстве приложений вам не придется определять нестандартные форматы.

На третьем этапе определяется уровень кооперации для мыши:

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

Как и в программе Qwerty, при вызове этой функции используются флаги совместного ( DISCL_NONEXCLUSIVE) и активного ( DISCL_FOREGROUND) режимов доступа. Первый означает, что во время работы нашей программы другое приложение может получить монопольный доступ к мыши, а второй — что, находясь в фоновом режиме, наше приложение не получает ввод от мыши.

Остается лишь задать размер буфера данных функцией SetProperty()интерфейса DirectInputDevice. Размер буфера определяет количество событий, сохраняемых в очереди DirectInput. Если буфер слишком мал, возникает риск потери данных из-за его переполнения. Я снова привожу соответствующий фрагмент листинга 6.5:

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);

Функция SetProperty()получает два аргумента: величину, которая определяет задаваемое свойство, и адрес структуры DIPROPDWORD. Среди прочего эта структура содержит значение свойства.

В нашем случае константа DIPROP_BUFFERSIZEговорит о том, что SetProperty()задает размер буфера. Поле dwSizeструктуры propertyравно 64; это значит, что мы заказываем буфер данных из 64 элементов. Размер буфера выбирается достаточно произвольно. Он должен быть достаточно большим, чтобы избежать переполнения, и достаточно малым, чтобы не тратить память напрасно.

Подготовка мыши закончена; осталось лишь захватить ее перед получением данных. Перед тем как захватывать мышь, мы кратко рассмотрим процесс инициализации клавиатуры.

Инициализация клавиатуры

Инициализация клавиатуры выполняется функцией InitKeyboard():

BOOL SmearWin::InitKeyboard() {

HRESULT r;

r = dinput->CreateDevice(GUID_SysKeyboard, &keyboard, 0);

if (r!=DI_OK) {

TRACE("CreateDevice(keyboard) failed");

return FALSE;

}

r = keyboard->SetDataFormat(&c_dfDIKeyboard);

if (r!=DI_OK) {

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

return FALSE;

}

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

if (r!=DI_OK) {

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

return FALSE;

}

return TRUE;

}

Инициализация клавиатуры происходит так же, как и в программе Qwerty.

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

Перед тем как получать данные от клавиатуры или мыши, необходимо предварительно захватить их. Кроме того, устройство приходится захватывать заново, если приложение некоторое время было неактивным. И исходный, и все последующие захваты устройства выполняются в обработчике OnActivate():

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.

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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