共用方式為


如何:在您的程式碼中實作追蹤

若要追蹤 OLE 專案,您必須處理與專案相關的特定事件,例如按一下專案或更新檔的檢視。 在所有情況下,只要宣告暫時的 CRectTracker 物件,並透過這個物件操作專案就已足夠。

當使用者選取專案或插入具有功能表命令的物件時,您必須使用適當的樣式初始化追蹤器,才能代表 OLE 專案的狀態。 下表概述 OCLIENT 範例所使用的慣例。 如需這些樣式的詳細資訊,請參閱 CRectTracker

OLE 專案的容器樣式和狀態

顯示樣式 OLE 專案的狀態
虛線框線 專案已連結
實心框線 專案內嵌在您的檔中
調整控點大小 專案目前已選取
影線框線 專案目前為就地作用中
影線圖樣重迭專案 專案的伺服器已開啟

您可以使用檢查 OLE 專案狀態並設定適當樣式的程式,輕鬆地處理此初始化。 SetupTrackerOCLIENT 範例中找到的函式示範追蹤器初始化。 此函式的參數是追蹤器 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 的函式。

在您的應用程式中,將會發生需要追蹤器程式碼的事件,例如調整大小、移動或點擊偵測。 這些動作通常表示嘗試抓取或移動專案。 在這些情況下,您必須決定擷取的內容:調整大小控點或調整大小控點之間的部分框線。 訊息 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 應用程式中實作追蹤器