共用方式為


How to: 實作程式碼中追蹤

若要追蹤一個 OLE 項目,您必須處理某些項目,例如按一下項目,或者更新文件的檢視相關的事件。 在所有情況下,就足以宣告暫存 CRectTracker 物件,並透過此物件的方式操作項目。

當使用者選取項目,或插入的功能表命令的物件時,您必須初始化追蹤器],以適當的樣式,來表示 OLE 項目的狀態。 下表描述 OCLIENT 範例所使用的慣例。 如需有關這些樣式的詳細資訊,請參閱CRectTracker

容器的樣式及 OLE 項目狀態

顯示樣式

OLE 項目的狀態

點狀的框線

項目連結

實心框線

項目被內嵌在文件中

調整大小控點

目前選取的項目

影線框的線

項目是目前就地啟動

影線圖樣覆疊項目

項目的伺服器已開啟

您可以處理這個很容易地使用檢查 OLE 項目的狀態,並設定適當樣式的程序的初始化。 SetupTracker 在 OCLIENT 範例中找到的函式示範追蹤器 」 的初始設定。 這個函式的參數都是追蹤器] 中,位址 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的檢視類別的函式。 每次重繪檢視時,這會更新追蹤器] 的外觀。 如需完整的範例,請參閱 CMainView::OnDraw 函式的 MFC OLE 範例 OCLIENT

在應用程式中需要 tracker 程式碼,例如調整大小、 移動或點擊偵測,事件會發生的。 這些動作通常指示正在嘗試抓取或移動項目。 在這些情況下,您必須決定控制點: 調整大小控點或部分之間的框線大小調整控點。 OnLButtonDown訊息處理常式是測試相對於項目的滑鼠位置的好地方。 呼叫CRectTracker::HitTest。 如果測試傳回以外的某些項目 CRectTracker::hitOutside、 項目會被調整大小或移動。 因此,您應該要呼叫Track成員函式。 請參閱 CMainView::OnLButtonDown 函式位於 MFC OLE 範例 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);
}

請參閱

概念

追蹤者: OLE 應用程式中實作追蹤者