которое должно быть указателем на
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-информацию о классе.
Содержание Назад Вперед