Практическое руководство. Реализация отслеживания в коде
Чтобы отслеживать элемент OLE, необходимо обрабатывать определенные события, связанные с элементом, например щелкнуть элемент или обновить представление документа. Во всех случаях достаточно объявить временный объект CRectTracker и управлять элементом с помощью этого объекта.
Когда пользователь выбирает элемент или вставляет объект с помощью команды меню, необходимо инициализировать трекер с соответствующими стилями, чтобы представить состояние элемента OLE. В следующей таблице описаны соглашения, используемые примером OCLIENT. Дополнительные сведения об этих стилях см. в разделе CRectTracker
.
Стили контейнеров и состояния элемента OLE
Отображаемый стиль | Состояние элемента OLE |
---|---|
Точка границы | Элемент связан |
Сплошная граница | Элемент внедрен в документ |
Маркеры изменения размера | Элемент в настоящее время выбран |
Штриховка границы | Элемент в настоящее время активен на месте |
Элемент наложения шаблонов штриховки | Сервер элемента открыт |
Эту инициализацию можно легко обрабатывать с помощью процедуры, которая проверка состояние элемента OLE и задает соответствующие стили. Функция, найденная SetupTracker
в примере OCLIENT, демонстрирует инициализацию трекера. Параметры этой функции — это адрес средства отслеживания, pTracker; указатель на клиентский элемент, связанный с трекером, pItem; и указателем на прямоугольник, pTrueRect. Более полный пример этой функции см. в примере OCLIENT OCLIENT для MFC OLE.
Пример кода SetupTracker представляет одну функцию. Строки функции перемежаются с обсуждением функций функции:
void CMainView::SetupTracker(CRectTracker* pTracker, CRectItem* pItem,
CRect* pTrueRect)
Средство отслеживания инициализируется путем установки минимального размера и очистки стиля трекера.
// set minimum size for our OLE items
pTracker->m_sizeMin.cx = 8;
pTracker->m_sizeMin.cy = 8;
pTracker->m_nStyle = 0;
Следующие строки проверка, чтобы узнать, выбран ли элемент и связан ли элемент с документом или внедрен в него. Дескриптор изменения размера, расположенный внутри границы, добавляется в стиль, указывающий, что элемент в данный момент выбран. Если элемент связан с документом, используется стиль точечной границы. Сплошная граница используется, если элемент внедрен.
// setup resize handles if item is selected
if (pItem == m_pSelection)
pTracker->m_nStyle |= CRectTracker::resizeInside;
// put correct border depending on item type
if (pItem->GetType() == OT_LINK)
pTracker->m_nStyle |= CRectTracker::dottedLine;
else
pTracker->m_nStyle |= CRectTracker::solidLine;
Следующий код наложен на элемент с люком, если элемент открыт в данный момент.
// put hatching over the item if it is currently open
if (pItem->GetItemState() == COleClientItem::openState ||
pItem->GetItemState() == COleClientItem::activeUIState)
{
pTracker->m_nStyle |= CRectTracker::hatchInside;
}
После этого эту функцию можно вызывать всякий раз, когда должен отображаться трекер. Например, вызовите эту функцию из OnDraw
функции класса представления. Это обновляет внешний вид трекера всякий раз, когда представление переопределено. Полный пример см. в CMainView::OnDraw
функции примера OCLIENT для MFC OLE.
В приложении будут возникать события, для которых требуется код отслеживания, например изменение размера, перемещение или обнаружение попаданий. Обычно эти действия указывают на то, что выполняется попытка захвата или перемещения элемента. В этих случаях необходимо решить, что было схвачено: дескриптор изменения размера или часть границы между дескрипторами изменения размера. Обработчик OnLButtonDown
сообщений является хорошим местом для проверки положения мыши относительно элемента. CRectTracker::HitTest
Вызов . Если тест возвращает что-то еще CRectTracker::hitOutside
, элемент изменяется или перемещается. Поэтому необходимо вызвать функцию-член Track
. Полный пример см. CMainView::OnLButtonDown
в функции, расположенной в примере OCLIENT для MFC.
Класс CRectTracker
предоставляет несколько различных фигур курсоров, используемых для указания того, выполняется ли операция перемещения, изменения размера или перетаскивания. Чтобы обработать это событие, проверка, чтобы узнать, выбран ли элемент под мышью. Если это так, выполните вызов CRectTracker::SetCursor
или вызов обработчика по умолчанию. Следующий пример приведен в примере OCLIENT для OLE MFC:
BOOL CMainView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (pWnd == this && m_pSelection != NULL)
{
// give the tracker for the selection a chance
CRectTracker tracker;
SetupTracker(&tracker, m_pSelection);
if (tracker.SetCursor(this, nHitTest))
return TRUE;
}
return CScrollView::OnSetCursor(pWnd, nHitTest, message);
}
См. также
Средства отслеживания. Реализация средств отслеживания в приложении OLE