Gewusst wie: Implementieren der Nachverfolgung im Code

Um ein OLE-Element nachzuverfolgen, müssen Sie bestimmte Ereignisse im Zusammenhang mit dem Element behandeln, z. B. auf das Element klicken oder die Ansicht des Dokuments aktualisieren. In allen Fällen reicht es aus, ein temporäres CRectTracker-Objekt zu deklarieren und das Element mithilfe dieses Objekts zu bearbeiten.

Wenn ein Benutzer ein Element auswählt oder ein Objekt mit einem Menübefehl einfügt, müssen Sie den Tracker mit den richtigen Formatvorlagen initialisieren, um den Zustand des OLE-Elements darzustellen. In der folgenden Tabelle werden die konventionen beschrieben, die vom OCLIENT-Beispiel verwendet werden. Weitere Informationen zu diesen Formatvorlagen finden Sie unter CRectTracker.

Containerformatvorlagen und -zustände des OLE-Elements

Angezeigte Formatvorlage Status des OLE-Elements
Gepunkteter Rahmen Element ist verknüpft
Einfarbiger Rahmen Element ist in Ihr Dokument eingebettet
Handles zum Ändern der Größe Das Element ist zurzeit ausgewählt.
Geschlüpfter Rahmen Element ist derzeit aktiv
Element "Schlupfmusterüberlagerungen" Der Server des Elements ist geöffnet.

Sie können diese Initialisierung ganz einfach mithilfe einer Prozedur behandeln, die den Status des OLE-Elements überprüft und die entsprechenden Formatvorlagen festlegt. Die SetupTracker im OCLIENT-Beispiel gefundene Funktion veranschaulicht die Trackerinitialisierung. Die Parameter für diese Funktion sind die Adresse des Trackers, pTracker; ein Zeiger auf das Clientelement, das mit dem Tracker, pItem verknüpft ist, und ein Zeiger auf ein Rechteck, pTrueRect. Ein vollständiges Beispiel für diese Funktion finden Sie im MFC OLE-Beispiel-OCLIENT.

Im Codebeispiel "SetupTracker" wird eine einzelne Funktion dargestellt. Zeilen der Funktion werden durch die Erläuterung der Funktionen der Funktion interspersiert:The SetupTracker code example presents a single function; lines of the function are interspersed with discussion of the function's features:

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

Der Tracker wird initialisiert, indem die Mindestgröße festgelegt und der Stil des Trackers gelöscht wird.

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

pTracker->m_nStyle = 0;

In den folgenden Zeilen wird überprüft, ob das Element aktuell ausgewählt ist und ob das Element mit dem Dokument verknüpft oder darin eingebettet ist. Der Formatvorlage werden Ziehpunkte, die sich auf der Innenseite des Rahmens befinden, hinzugefügt, was angibt, dass das Element aktuell ausgewählt ist. Wenn das Element mit Ihrem Dokument verknüpft ist, wird die gepunktete Rahmenart verwendet. Ein durchgezogener Rahmen wird verwendet, wenn das Element eingebettet ist.

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

Der folgende Code überlagert das Element mit einem geschlüpften Muster, wenn das Element zurzeit geöffnet ist.

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

Sie können diese Funktion dann aufrufen, wenn der Tracker angezeigt werden muss. Rufen Sie diese Funktion beispielsweise aus der OnDraw Funktion Der Ansichtsklasse auf. Dadurch wird die Darstellung des Trackers aktualisiert, wenn die Ansicht aktualisiert wird. Ein vollständiges Beispiel finden Sie in der CMainView::OnDraw Funktion des MFC OLE-Beispiel-OCLIENT.

In Ihrer Anwendung treten Ereignisse, die Trackercode erfordern, z. B. Größenänderung, Verschieben oder Treffererkennung, auf. Diese Aktionen deuten in der Regel darauf hin, dass versucht wird, das Element zu greifen oder zu verschieben. In diesen Fällen müssen Sie entscheiden, was geraubt wurde: ein Ziehpunkt zur Größenänderung oder ein Teil des Rahmens zwischen Ziehpunkten für größenänderung. Der OnLButtonDown Nachrichtenhandler ist ein guter Ort, um die Position der Maus im Verhältnis zum Element zu testen. Rufen Sie an CRectTracker::HitTest. Wenn der Test etwas anderes CRectTracker::hitOutsidezurückgibt, wird die Größe des Elements geändert oder verschoben. Daher sollten Sie die Memberfunktion aufrufen Track . Ein vollständiges Beispiel finden Sie in der CMainView::OnLButtonDown Funktion im MFC OLE-Beispiel-OCLIENT.

Die CRectTracker Klasse stellt mehrere verschiedene Cursor-Shapes bereit, mit der angegeben wird, ob ein Verschiebungs-, Größen- oder Ziehvorgang stattfindet. Um dieses Ereignis zu behandeln, überprüfen Sie, ob das Element derzeit unter der Maus ausgewählt ist. Führen Sie in diesem Beispiel einen Aufruf CRectTracker::SetCursordurch, oder rufen Sie den Standardhandler auf. Das folgende Beispiel stammt aus dem MFC OLE-Beispiel-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);
}

Siehe auch

Tracker: Implementieren von Trackern in einer OLE-Anwendung