Практическое руководство. Реализация отслеживания в коде
Для отслеживания элемент OLE необходимо обрабатывать некоторые события, относящиеся к элементу, например щелкните элемент или обновить представление документа.Во всех случаях достаточно объявить временный объект CRectTracker и управлять элемент посредством данного объекта.
Когда пользователь выбирает элемент или вставляет объект с помощью команды меню, необходимо инициализировать объект отслеживания с правильными стилей для представления состояние элемента OLE.В следующей таблице конспектирует соглашения, используемые образцом OCLIENT.Дополнительные сведения об этих стилях см. в разделе CRectTracker.
Стили и состояния OLE элемента контейнера
Отображаемый стиль |
Состояние ЯВЛЯЕТСЯ элемента |
---|---|
Переданную точки " граница " |
Элемент связан |
Сплошная граница |
Элемент внедрен в документе |
Маркеры изменения размера |
Элемент выбранного на текущий момент |
Насиженная " граница " |
Элемент в настоящий момент активны на месте |
Шаблон штриховки " overlays элемент |
Сервер элемента открыт |
Можно обработать это легко инициализации с помощью процедуры, которая проверяет состояние ЯВЛЯЕТСЯ элемента, и устанавливает соответствующие стили.Функция SetupTracker обнаружен в образце OCLIENT демонстрируется инициализация отслеживания.Параметры для данной функции адрес отслеживания, pTracker; указатель на элемент, связанный с отслежывателю, pItem клиента; и указатель в прямоугольник, pTrueRect.Для более полного примера данной функции см. в образце ObjectName MFC OLE.
Пример кода SetupTracker представляет одну функцию. interspersed линии функции с обсуждением функций функции:
void CMainView::SetupTracker(CRectTracker* pTracker, CRectItem* pItem,
CRect* pTrueRect)
Tracker инициализирован с помощью минимального размера и очистка стиль отслеживания.
// 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;
Следующий код overlays элемент с насиженным шаблоном если элемент в данный момент открыт.
// 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 примеры MFC ObjectName OLE.
В приложении события, требующие код отслеживания, например, размер, перемещение или обнаружение, выполненная строка.Эти действия обычно указывают на то, что делается попытка захватить или переместить элемент.В этих случаях необходимо решить, что было захваченно: маркер изменения размера или часть границы между маркерами размера.Обработчик сообщений OnLButtonDown удобен для тестирования положения указателя мыши относительно элемента.Вызвать CRectTracker::HitTest.Если тест возвращает что-то, кроме CRectTracker::hitOutside, то размер или переместить элемент.Поэтому необходимо вызвать метод Track к функции-члену.См. описание функции CMainView::OnLButtonDown расположенную в образце MFC OLE ObjectName для полного примера.
Класс CRectTracker предоставляет несколько различных фигур курсора, используемых для указания выполняемые ли перемещение, размер или операция перетаскивания.Обработать это событие проверьте, чтобы увидеть, выбран ли элемент в данный момент под указателем мыши.Если да, то вызвать CRectTracker::SetCursor или вызове обработчика по умолчанию.В следующем примере из образца ObjectName MFC OLE:
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