如何:实现跟踪在代码

若要跟踪 OLE 项,您必须处理特定事件与项目相关,例如单击该项或更新文档的视图。 在所有情况下,声明一个临时 CRectTracker 对象并将此对象操作项就足够了。

当用户选择项目或插入与菜单命令对象时,必须初始化 TRACKER 了适当的样式表示该 OLE 项的状态。 下表概述了 OCLIENT 示例使用的约定。 有关这些样式的更多信息,请参见 CRectTracker

容器 OLE 项的样式和状态

显示的样式

OLE 项状态

虚线边框

项链接

内置的边框

项目中嵌入文档

大小调整句柄

项目当前选定

阴影边框

项目当前处于就地活动

策划模式复盖项目

项目的服务器处于打开状态

可以很方便地将处理此初始化用于检查该 OLE 项状态并设置适当的样式的过程。 在 OCLIENT 示例中的 SetupTracker 函数来演示 TRACKER 初始化。 此函数的参数是一个跟踪器, pTracker 的地址;到一个跟踪器相关的客户端项目, pItem的指针;对矩形, pTrueRect 的指针。 有关此功能的更完整示例,请参见 MFC OLE 示例 OCLIENT

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 函数中调用此函数。 将更新 TRACKER 的外观,只要视图中重新绘制。 有关完整示例,请参见 MFC OLE 示例 OCLIENTCMainView::OnDraw 功能。

在应用程序中,需要 TRACKER 代码,如调整,将检测的事件、命中,将发生。 这些事件通常指示尝试获取或将项目。 在这些情况下,您需要决定捕获:大小调整句柄或之间边框的部分大小调整句柄。 OnLButtonDown 消息处理程序是测试鼠标的位置的介绍提供有关项目。 仅仅是对 CRectTracker::HitTest。 如果测试返回不同于 CRectTracker::hitOutside之外,该项目会调整或移动。 因此,应调用到 Track 成员函数。 为完整示例参见位于 MFC OLE 示例的 CMainView::OnLButtonDown 功能 OCLIENT

CRectTracker 类中的若干不同的光标形状指示移动,则调整,或者拖动操作发生。 处理此事件,将检查项目在鼠标下当前是否已选择。 如果是,中调用 CRectTracker::SetCursor或调用默认处理程序。 下面的示例摘自 MFC OLE 示例 OCLIENT:

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);
}

请参见

概念

TRACKER:用于实现OLE应用程序的跟踪器