Jak zaimplementować śledzenie w kodzie

Uwaga / Notatka

Biblioteka Klas programu Microsoft Foundation (MFC) nadal jest obsługiwana. Nie dodajemy już funkcji ani nie aktualizujemy dokumentacji.

Aby śledzić element OLE, należy obsługiwać niektóre zdarzenia związane z elementem, takie jak kliknięcie elementu lub zaktualizowanie widoku dokumentu. We wszystkich przypadkach wystarczy zadeklarować tymczasowy obiekt CRectTracker i manipulować elementem za pomocą tego obiektu.

Gdy użytkownik wybierze element lub wstawi obiekt za pomocą polecenia menu, musisz zainicjować tracker z odpowiednimi stylami, aby reprezentować stan elementu OLE. W poniższej tabeli przedstawiono konwencje używane przez przykład OCLIENT. Aby uzyskać więcej informacji na temat tych stylów, zobacz CRectTracker.

Style kontenera i stany elementu OLE

Wyświetlony styl Stan elementu OLE
Obramowanie kropkowane Element jest połączony
Obramowanie stałe Element jest osadzony w dokumencie
Zmienianie rozmiaru uchwytów Element jest obecnie zaznaczony
Obramowanie szrafowane Element jest obecnie aktywny w swojej bieżącej lokalizacji
Element nakładania deseń kreskowania Serwer elementu jest otwarty

Tę inicjację można łatwo obsłużyć przy użyciu procedury, która sprawdza stan elementu OLE i ustawia odpowiednie style. Funkcja SetupTracker występująca w przykładzie OCLIENT pokazuje inicjalizację trackera. Parametry tej funkcji to adres trackera, pTracker; wskaźnik do elementu klienta, który jest powiązany z trackerem, pItem; i wskaźnik do prostokąta, pTrueRect. Aby uzyskać bardziej kompletny przykład tej funkcji, zobacz przykładowy obiekt OCLIENT MFC OLE.

Przykład kodu SetupTracker przedstawia jedną funkcję; wiersze funkcji są przeplatane z omówieniem funkcji:

void CMainView::SetupTracker(CRectTracker* pTracker, CRectItem* pItem,
   CRect* pTrueRect)

Tracker jest inicjowany przez ustawienie minimalnego rozmiaru i wyczyszczenie stylu trackera.

// set minimum size for our OLE items
pTracker->m_sizeMin.cx = 8;
pTracker->m_sizeMin.cy = 8;

pTracker->m_nStyle = 0;

Poniższe wiersze sprawdzają, czy element jest aktualnie zaznaczony i czy element jest połączony z dokumentem, czy osadzony w nim. Uchwyty zmiany rozmiaru znajdujące się wewnątrz obramowania są dodawane do stylu, co oznacza, że element jest aktualnie zaznaczony. Jeśli element jest połączony z dokumentem, zostanie użyty styl obramowania kropkowanego. Używa się stałego obramowania, jeśli element jest osadzony.

// 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;

Poniższy kod nakłada na element wzorzec kreskowany, jeśli element jest obecnie otwarty.

// put hatching over the item if it is currently open
if (pItem->GetItemState() == COleClientItem::openState ||
   pItem->GetItemState() == COleClientItem::activeUIState)
{
   pTracker->m_nStyle |= CRectTracker::hatchInside;
}

Następnie można wywołać tę funkcję za każdym razem, gdy monitor musi być wyświetlany. Na przykład wywołaj tę funkcję z OnDraw funkcji klasy widoku. Spowoduje to zaktualizowanie wyglądu trackera za każdym razem, gdy widok zostanie przemalowany. Aby zapoznać się z kompletnym przykładem, zobacz funkcję CMainView::OnDraw w próbce MFC OLE OCLIENT.

W aplikacji będą występować zdarzenia wymagające kodu śledzącego, takie jak zmiana rozmiaru, przenoszenie lub wykrywanie trafień. Te działania zwykle wskazują, że podejmowana jest próba chwycenia lub przesunięcia przedmiotu. W takich przypadkach należy zdecydować, co zostało złapane: uchwyt zmiany rozmiaru lub część obramowania między uchwytami zmiany rozmiaru. Procedura OnLButtonDown obsługi komunikatów jest odpowiednim miejscem do przetestowania położenia myszy w odniesieniu do obiektu. Wywołaj metodę CRectTracker::HitTest. Jeśli test zwraca coś innego niż CRectTracker::hitOutside elementem, jest on zmieniany lub przenoszony. W związku z tym należy wykonać wywołanie funkcji składowej Track . Zobacz funkcję CMainView::OnLButtonDown znajdującą się w przykładzie MFC OLE OCLIENT, aby zapoznać się z kompletnym przykładem.

Klasa CRectTracker udostępnia kilka różnych kształtów kursora używanych do wskazywania, czy odbywa się operacja przenoszenia, zmiany rozmiaru lub przeciągania. Aby obsłużyć to zdarzenie, sprawdź, czy element znajdujący się obecnie pod myszą jest zaznaczony. Jeśli tak jest, wywołaj funkcję CRectTracker::SetCursor, lub wywołaj domyślną procedurę obsługi. Poniższy przykład pochodzi z przykładu 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);
}

Zobacz także

Trackery: implementowanie trackerów w aplikacji OLE