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



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


if (FAILED(m_hr)) return NULL;

// Проверить, есть ли в массиве элементы if (pIPickArray-»GetSize () == 0) { pIPickArray-»Release () ;

return NULL;

)

// Получить первый (верхний) элемент IDirect3DRMVisual* pIVisual = NULL;

IDirect3DRMFrameArray* pIFrameList = NULL;

m hr = pIPickArray-»GetPick(0, SpIVisual, SpIFrameList, NULL) ;

ASSERT(SUCCEEDED(m_hr)) ;

ASSERT(pIVisual) ;

ASSERT(pIFrameList) ;

// Получить последний фрейм в списке IDirect3DRMFrame* pIFrame - NULL;

pIFrameList-»GetEiement (pIFrameList-»GetSize () - 1, &pI Frame);

ASSERT(pIFrame) ;

// Получить значение 'AppData' фрейма, // которое должно быть указателем на класс C++

C3ctShape* pShape = (C3dShape*) pIFrame-»GetAppData () ;

if (pShape) (

if(!pShape-»IsKindOf(RUNTIME_CLASS(C3dShape))) { pShape = NULL;

}

pIFrame-»Release () ;

pIFrameList-»Release () pIVisual-»Release () ;

pIPickArray-»Release ()

return pShape;

Первым делом мы требуем от интерфейса ракурса создать то, что в механизме визуализации называется списком выбора (pick list), то есть список всех визуальных элементов, находящихся под определенной точкой окна. Список визуальных элементов (pIPickArray) упорядочен так, чтобы верхний элемент находился в начале списка. Затем мы определяем значение указателя (pIVisual) на первый визуальный элемент и получаем по нему список фреймов (pIFrameList), к которым присо-

<::::й^

Выделение всего объекта т¦¦¦¦ 169

единен данный визуальный элемент. На Рисунок 7-1 показано, как связаны между собой объекты различных списков.

Список фреймов начинается с корневого фрейма (макета), за которым последовательно перечисляются все фреймы-потомки до самого последнего, содержащего отмеченный визуальный элемент.

Рисунок. 7-1. Структура списка выбора


Последнее, что нам осталось сделать, — извлечь значение переменной AppData из интерфейса фрейма. Объекты классов CSdFrame и C3dShape хранят в этой переменной значения своих указателей this. Мы преобразуем значение AppData к типу указателя на объект C3dShape и проверяем, не равен ли получившийся указатель NULL. Если не равен, то выполняется дополнительная проверка того, что данный указатель является указателем на объект C3dShape, с использованием функции MFC, возвращающей runtime-информацию о классе.




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