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



Проверка попадания - часть 3


int CMainFrame::OnCreate(LPCREATESTRUCT IpCreateStruct) {

// Разрешить выделение объектов мышью m_wnd3d.EnableMouseSelection(OnSelChange, this);

}

/b> lly Глава 7. Проверка попадания

В приведенной выше строке программы устанавливается уведомляющая функция OnSelChange. Функция OnSelChange является статической функцией класса CMainFrame, и потому значение указателя this для нее не определено. Как мы вскоре увидим, второй аргумент функции EnableMouseSetection передается в виде аргумента рАгд при вызове уведомляющей функции — в данном случае мы передаем указатель на объект C++ (если этот момент покажется вам непонятным, просмотрите код функции EnableMouseSelection в файле C3dWnd.cpp). Давайте посмотрим, как щелчок мышью обрабатывается в классе C3dWnd — это снова приведет нас к обсуждению уведомляющей функции. Ниже приведен фрагмент обработчика сообщений окна, связанный с проверкой попадания:

BOOL C3dWnd::OnWndMsg(UINT message, WPARAM wParam,

LPARAM IParam, LRESULT* pResult ) {

// Разрешено ли выделение объектов мышью?

if (m_bEnableMouseSelection

&& (message == WM_LBUTTONDOWN)) (

CPoint pt(LOWORDfIParam), HIWORD(IParam));

C3dShape* pShape = HitTest(pt);

if (m_p3elChangeFn) {

// Вызвать уведомляющую функцию m_pSelChangeFn(pShape, pt, m pSelChangeArg);

} }

return CWnd::OnWndMsg(message, wParam, IParam, pResult);

}

Если выделение мышью было разрешено (рассматривается именно этот случай), мы создаем объект CPoint по координатам мыши, содержащимся в сообщении WM_LBUTTONDOWN, а затем вызываем функцию HitTest, чтобы определить, произошло ли попадание в фигуру. Результат проверки (который равен NULL, если под мышью не оказалось ни одного объекта) возвращается приложению через уведомляющую функцию (которая была указана при разрешении выделения мышью). Давайте посмотрим, как уведомляющая функция используется в приложении:

void CMainFrame::OnSelChange(C3dShape* pShape, CPoint pt,

void* pArg) (

// Получить указатель на класс

CMainFrame* pThis = (CMainFrame*) pArg;




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