ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX


         

Устройство ввода от мыши выглядит


Устройство ввода от мыши выглядит несколько проще. Поскольку мышь обладает только двумя степенями свободы, необходимо определить, каким образом два входных параметра отображаются на шесть выходных осей (табл. 6-2).

Таблица 6-2. Управляющие функции мыши

Входной параметр Normal Shift Ctrl

X X -V -U

Y -Y -Z -R

/b> iiisi^ Глава б. Пепемешение объектов в макете

Обратите внимание на то, что некоторые параметры инвертируются. Я изменил направление осей, чтобы управление стало более логичным. Код устройства ввода от мыши состоит из двух функций: C3dMouselnDev::OnUserEvent и C3dMouselnDev::GetState. Первая функция, исходный текст которой приведен ниже, находится в файле 3dlnpDev.cpp. Данная функция обрабатывает перемещение мыши и захватывает ее указатель (то есть ограничивает его перемещение текущим окном) при нажатии левой кнопки:

void C3dMouseInDev::OnUserEvent(HWND hWnd, UINT uiMsg,

WPARAM wParam, LPARAM IParam) (

switch (uiMsg) { case WM_LBUTTONDOWN:

::SetCapture(hWnd) ;

m_bCaptured = TRUE;

break;

case WM_LBUTTONUP:

if (m_bCaptured) { ::ReleaseCapture () ;

m_bCaptured = FALSE;

} break;

case WM_MOUSEMOVE:

if (m_bCaptured) (

// Внимание: экранные координаты! (см. C3dWnd)

m_ptCur.x = LOWORD(IParam);

m_ptCur.y = HIWORD(IParam);

m_dwFlags = wParam;

} break;

default:

break;

}

\ i

Положение мыши запоминается в m_ptCur, локальной структуре класса CPoint. Вторая функция, исходный текст которой приведен ниже, вызывается, когда контроллер запрашивает текущее состояние устройства ввода:

BOOL C3dMouseInDev::GetState(_3DINPUTSTATE& st) {

if (m_ptPrev.x « 0) { m_ptPrev = m_ptCur;

}

Устоойство ввода '"SH 139

if (m_dwFlags & MK_SHIFT) {

m_st.dz = -d;

} else if (m_dwFlags & MK_CONTROL) {

rri_st.dR = -d;

} else (

m_st.dY = -d;

) )

m_ptPrev = m_ptCur;

st = m_st;

return TRUE;

Функция обрабатывает полученные значения х и у таким образом, чтобы обеспечить небольшую «мертвую зону» для малых смещений и предотвратить случайное перемещение объекта. Затем смещения умножаются на коэффициент пропорциональности, чтобы перемещение объектов всегда происходило в правильном масштабе. Наконец, в зависимости от текущего состояния клавиш Shift и Ctrl функция определяет, какие выходные параметры следует изменить.


Содержание  Назад  Вперед