Sdílet prostřednictvím


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 správnými styly inicializovat sledovač, aby reprezentoval 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řekrytá šrafovacím vzorem 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 ukazatel 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)

Sledovač se inicializuje nastavením minimální velikosti a vymazáním stylu sledovače.

// 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í jsou součástí stylu a indikují, že položka je právě 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 právě 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 můžete volat pokaždé, když se má zobrazit sledovací systém. Tuto funkci můžete například volat z funkce třídy vašeho zobrazení OnDraw. Tím se aktualizuje vzhled sledovače vždy, když dojde k 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 přizpůsobení velikosti nebo část ohraničení mezi úchyty pro přizpůsobení velikosti. Zpracovatel OnLButtonDown zprávy je vhodným místem k otestování pozice myši ve vztahu k položce. Zavolejte na CRectTracker::HitTest. Pokud test vrátí něco kromě CRectTracker::hitOutside, položka je měněna nebo přesouvána. Proto byste měli volat funkci člena Track. 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, zda je položka, která je aktuálně pod myší, vybraná. Pokud ano, proveďte volání na 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);
}

Viz také

Trackery: Implementace trackerů v aplikaci OLE