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);
}