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