Freigeben über


Gewusst wie: Implementieren der Nachverfolgung im Code

Um ein OLE-Element nachzuverfolgen, müssen Sie bestimmte Ereignisse behandeln, die auf das Element, beispielsweise durch Klicken auf das Element oder Aktualisieren des Dokuments verknüpft werden. In allen Fällen ist es ausreichend, ein temporäres CRectTracker-Objekt deklariert 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 Protokollierer mit den korrekten Formaten initialisieren, um den Zustand des OLE-Elements darzustellen. In der folgenden Tabelle werden die Konventionen, die durch das OCLIENT-Beispiel verwendet werden. Weitere Informationen über diese formatiert, sieht CRectTracker.

Container-Formate und Zustände des OLE-Elements

Format angezeigt

Zustand des OLE-Elements

Graugelber Breitflügelspanner

Element verknüpft wird

Ausgefüllter Rahmen

Element wird im Dokument eingebettet

Ziehpunkte

Element ist derzeit ausgewählt

Schraffierter Rahmen

Element ist einfach direkt aktiviert

Muster, schraffierend überlagert Element

Der Server des Elements ist geöffnet

Sie können die Initialisierung mit einer Prozedur bearbeiten, die den Zustand des OLE-Elements untersucht und die entsprechenden Stile festlegen. SetupTracker Die Funktion, die im OCLIENT-Beispiel gefunden wird, zeigt Protokolliererinitialisierung. Die Parameter dieser Funktion sind die Adresse des Protokollierers, pTracker; ein Zeiger z Clientelement, das z Protokollierer bezieht, pItem; und ein Zeiger auf ein Rechteck, pTrueRect. Weitere Informationen finden vollständiges Beispiel dieser Funktion, das Beispiel OCLIENT MFC-OLE.

Das SetupTracker Codebeispiel stellt eine einzelne Funktion dar; Zeilen der Funktion werden mit Informationen über die Funktionen der Funktion vermischt werden:

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

Der Protokollierer wird initialisiert, indem die minimale Größe festgelegt und das Format des Protokollierers löscht.

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

pTracker->m_nStyle = 0;

Die folgenden Zeilen überprüfen, um festzustellen, ob das Element nur ausgewählt wird und ob das Element dem Dokument verknüpft ist oder im Element eingebettet. Die Ziehpunkte auf der Innenseite des Rahmens werden in den Stil hinzugefügt und angeben, dass das Element derzeit ausgewählt ist. Wenn das Element dem Dokument verknüpft ist, wird das Graugelber Breitflügelspanner-Format verwendet. Ein durchgehender Kontext wird verwendet, wenn das Element eingebettet wird.

// 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 einer Schraffur, wenn das Element 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 Protokollierer angezeigt werden muss. Beispielsweise rufen Sie die Funktion von der OnDraw-Funktion der Ansichtsklasse auf. Dies aktualisiert die Darstellung des Protokollierers, wenn die Ansicht neu gestrichelt ist. Ein vollständiges Beispiel finden Sie die Funktion CMainView::OnDraw des Beispiels OCLIENT MFC-OLE.

In der Anwendung werden Ereignisse, die Protokollierercode, wie Größenanpassung benötigen und wechseln oder der erkennende Treffer, auf. Diese Aktionen geben normalerweise an, dass versucht wird, das Element zu erfassen oder verschieben gemacht wird. In diesen Fällen müssen Sie festlegen, was gegriffen wurde: Ziehpunkt oder ein Teil des Rahmens zwischen Ziehpunkten. Der OnLButtonDown - Meldungshandler eignet sich gut, der die Position der Maus in Bezug auf das Element zu testen. Führen Sie CRectTracker::HitTest einen Aufruf. Wenn der Test einige Ausnahme CRectTracker::hitOutside zurückgibt, wird das Element angepasst oder verschoben. Daher sollten Sie die Memberfunktion Track machen. Siehe die CMainView::OnLButtonDown-Funktion im Beispiel OCLIENT MFC-OLE für ein vollständiges Beispiel.

Die CRectTracker-Klasse stellt verschiedene Cursor-Formen, die verwendet werden, um anzugeben, ob ein Verschiebevorgang, Größe ändern, oder Ziehvorgang statt. Um dieses Ereignis behandeln, Überprüfung, um festzustellen, ob das Element direkt unter der Maus ausgewählt ist. Wenn es ist, führen Sie CRectTracker::SetCursor einen Aufruf, oder Sie rufen den Standardhandler auf. Im folgenden Beispiel ist vom Beispiel 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);
}

Siehe auch

Konzepte

Tracker: Implementieren von Trackern in einer OLE-Anwendung