Comment : implémenter le suivi dans votre code

Pour suivre un élément OLE, vous devez gérer certains événements associés à l'élément, tel que cliquer sur l'élément ou mettre à jour la vue du document. Dans tous les cas, il suffit de déclarer un objet CRectTracker temporaire et de manipuler l’élément au moyen de cet objet.

Lorsqu'un utilisateur sélectionne un élément ou insère un objet avec une commande de menu, vous devez initialiser le mécanisme de suivi avec les styles appropriés pour représenter l'état de l'élément OLE. Le tableau suivant présente les conventions utilisées par l'exemple OCLIENT. Pour plus d'informations sur ces styles, consultez CRectTracker.

Styles de conteneur et états de l'élément OLE

Style d'affichage État de l'élément OLE
Bordure en pointillés L'élément est lié
Bordure pleine L'élément est incorporé dans le document
Poignées de redimensionnement L'élément est actuellement sélectionné
Bordure hachurée L'élément est actuellement actif en place
Le modèle de hachurage recouvre l’élément Le serveur de l'élément est ouvert

Vous pouvez traiter cette initialisation facilement à l'aide d'une procédure qui vérifie l'état de l'élément OLE et qui définit les styles appropriés. La SetupTracker fonction trouvée dans l’exemple OCLIENT illustre l’initialisation du suivi. Les paramètres de cette fonction sont l’adresse du suivi, pTracker ; pointeur vers l’élément client lié au suivi, pItem et pointeur vers un rectangle, pTrueRect. Pour obtenir un exemple plus complet de cette fonction, consultez l’exemple OCLIENT OLE MFC.

L’exemple de code SetupTracker présente une fonction unique ; les lignes de la fonction sont entrelacées avec la discussion des fonctionnalités de la fonction :

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

Le dispositif de suivi est initialisé en définissant la taille minimale et en effaçant le style du dispositif de suivi.

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

pTracker->m_nStyle = 0;

Les lignes suivantes permettent de voir si l'élément est sélectionné et si l'élément est lié au document ou incorporé dans celui-ci. Des poignées de redimensionnement placées à l'intérieur de la bordure sont ajoutées au style, ce qui indique que l'élément est sélectionné. Si l'élément est lié à votre document, le style de bordure en pointillés est utilisé. Une bordure pleine est utilisée si l'élément est incorporé.

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

Le code suivant recouvre l’élément avec un modèle hachuré si l’élément est ouvert.

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

Vous pouvez ensuite appeler cette fonction lorsque le mécanisme de suivi doit être affiché. Par exemple, appeler cette fonction depuis la fonction OnDraw de votre classe d'affichage. Cela met à jour l'apparence du dispositif de suivi lorsque la vue est redessinée. Pour obtenir un exemple complet, consultez la CMainView::OnDraw fonction de l’exemple OCLIENT OLE MFC.

Dans votre application, les événements qui requièrent un code de suivi, tel que le redimensionnement, le déplacement ou la détection d'accès, se produisent. Ces actions indiquent généralement qu'une tentative a lieu pour saisir ou déplacer l'élément. Dans ce cas, vous devez déterminer ce qui a été saisi : une poignée de redimensionnement ou une partie de la bordure entre les poignées de redimensionnement. Le gestionnaire de messages OnLButtonDown est un bon endroit pour tester la position de la souris par rapport à l'élément. Effectuez un appel à CRectTracker::HitTest. Si le test retourne quelque chose de plus CRectTracker::hitOutside, l’élément est redimensionné ou déplacé. Par conséquent, vous devez effectuer un appel à la fonction membre Track. Consultez la CMainView::OnLButtonDown fonction située dans l’exemple OCLIENT OLE MFC pour obtenir un exemple complet.

La classe CRectTracker fournit différentes formes de curseur utilisées pour indiquer si un déplacement, un redimensionnement ou un glissement a lieu. Pour gérer l'événement, activez la case à cocher pour déterminer si l'élément actuellement sous la souris est sélectionné. Si tel est le cas, effectuez un appel à CRectTracker::SetCursor ou appelez le gestionnaire par défaut. L’exemple suivant provient de l’exemple OCLIENT OLE MFC :

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

Voir aussi

Dispositifs de suivi : implémentation de dispositifs de suivi dans votre application OLE