Postupy: Implementace sledování v kódu
Chcete-li sledovat položku OLE, musíte zpracovat určité události související s položkou, jako je například kliknutí na položku nebo aktualizace zobrazení dokumentu. Ve všech případech stačí deklarovat dočasný objekt CRectTracker a manipulovat s položkou pomocí tohoto objektu.
Když uživatel vybere položku nebo vloží objekt pomocí příkazu nabídky, musíte inicializovat sledování správnými styly, aby představoval stav položky OLE. Následující tabulka popisuje konvence používané ukázkou OCLIENT. Další informace o těchto stylech najdete v tématu CRectTracker
.
Styly a stavy kontejneru položky OLE
Zobrazený styl | Stav položky OLE |
---|---|
Tečkované ohraničení | Položka je propojená. |
Plné ohraničení | Položka je vložená do dokumentu. |
Úchyty pro změnu velikosti | Položka je aktuálně vybrána. |
Šrafované ohraničení | Položka je aktuálně aktivní. |
Položka překryvného vzoru šrafování | Server položky je otevřený. |
Tuto inicializaci můžete snadno zpracovat pomocí procedury, která kontroluje stav položky OLE a nastavuje příslušné styly. Funkce nalezená SetupTracker
v ukázce OCLIENT ukazuje inicializaci sledování. Parametry této funkce jsou adresa trackeru, pTracker; ukazatel na položku klienta, která souvisí s sledováním, pItem a ukazatelem na obdélník, pTrueRect. Podrobnější příklad této funkce najdete v ukázkovém objektu OCLIENT v prostředí MFC OLE.
Příklad kódu SetupTracker představuje jednu funkci; řádky funkce jsou propletené s diskuzí o funkcích funkce:
void CMainView::SetupTracker(CRectTracker* pTracker, CRectItem* pItem,
CRect* pTrueRect)
Sledování se inicializuje nastavením minimální velikosti a vymazáním stylu sledování.
// set minimum size for our OLE items
pTracker->m_sizeMin.cx = 8;
pTracker->m_sizeMin.cy = 8;
pTracker->m_nStyle = 0;
Následující řádky kontrolují, zda je položka aktuálně vybrána a zda je položka propojena s dokumentem nebo vložena do ní. Úchyty pro změnu velikosti umístěné na vnitřní straně ohraničení se přidají do stylu označující, že položka je aktuálně vybraná. Pokud je položka propojená s dokumentem, použije se tečkovaný styl ohraničení. Pokud je položka vložena, použije se plné ohraničení.
// 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;
Následující kód překryje položku šrafovaným vzorem, pokud je položka aktuálně otevřená.
// put hatching over the item if it is currently open
if (pItem->GetItemState() == COleClientItem::openState ||
pItem->GetItemState() == COleClientItem::activeUIState)
{
pTracker->m_nStyle |= CRectTracker::hatchInside;
}
Tuto funkci pak můžete volat vždy, když se musí zobrazit sledování. Tuto funkci můžete například volat z OnDraw
funkce třídy zobrazení. Tím se aktualizuje vzhled sledování při každém překreslení zobrazení. Úplný příklad najdete ve CMainView::OnDraw
funkci MFC OLE sample OCLIENT.
V aplikaci dojde k událostem, které vyžadují sledovací kód, například změnu velikosti, přesunutí nebo zjištění hitů. Tyto akce obvykle značí, že se jedná o pokus o získání nebo přesunutí položky. V těchto případech se budete muset rozhodnout, co se vzalo: úchyt pro změnu velikosti nebo část ohraničení mezi úchyty pro změnu velikosti. Obslužná rutina OnLButtonDown
zprávy je dobrým místem k otestování pozice myši ve vztahu k položce. Zavolejte .CRectTracker::HitTest
Pokud test vrátí něco kromě CRectTracker::hitOutside
, položka se změní nebo přesune. Proto byste měli volat členovou Track
funkci. CMainView::OnLButtonDown
Kompletní příklad najdete v ukázkovém objektu OCLIENT knihovny MFC OLE.
Třída CRectTracker
poskytuje několik různých obrazců kurzoru, které slouží k označení, zda probíhá operace přesunutí, změny velikosti nebo přetažení. Pokud chcete tuto událost zpracovat, zkontrolujte, jestli je položka aktuálně pod myší vybraná. Pokud ano, proveďte volání CRectTracker::SetCursor
nebo zavolejte výchozí obslužnou rutinu. Následující příklad pochází z ukázkového OCLIENT MFC OLE:
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);
}