如何:实现跟踪在代码
若要跟踪 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 示例 OCLIENT的 CMainView::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);
}