Contrôles ActiveX MFC : ajout d'événements personnalisés

Les événements personnalisés diffèrent des événements boursiers dans le fait qu’ils ne sont pas déclenchés automatiquement par classe COleControl. Un événement personnalisé reconnaît une certaine action, déterminée par le développeur du contrôle, en tant qu’événement. Les entrées de mappage d’événements pour les événements personnalisés sont représentées par la macro EVENT_CUSTOM. La section suivante implémente un événement personnalisé pour un projet de contrôle ActiveX créé à l’aide de l’Assistant Contrôle ActiveX.

Ajout d’un événement personnalisé avec l’Assistant Ajouter un événement

La procédure suivante ajoute un événement personnalisé spécifique, ClickIn. Vous pouvez utiliser cette procédure pour ajouter d’autres événements personnalisés. Remplacez votre nom d’événement personnalisé et ses paramètres par le nom et les paramètres de l’événement ClickIn.

Pour ajouter l’événement personnalisé ClickIn à l’aide de l’Assistant Ajouter un événement

  1. Chargez votre projet de contrôle.

  2. En mode Classe, cliquez avec le bouton droit sur votre classe de contrôle ActiveX pour ouvrir le menu contextuel.

  3. Dans le menu contextuel, cliquez sur Ajouter , puis sur Ajouter un événement.

    L’Assistant Ajouter un événement s’ouvre.

  4. Dans la zone Nom de l’événement, sélectionnez d’abord un événement existant, puis cliquez sur la case d’option Personnalisée, puis tapez ClickIn.

  5. Dans la zone Nom interne , tapez le nom de la fonction de déclenchement de l’événement. Pour cet exemple, utilisez la valeur par défaut fournie par l’Assistant Ajouter un événement (FireClickIn).

  6. Ajoutez un paramètre appelé xCoord (type OLE_XPOS_PIXELS), à l’aide des contrôles Nom du paramètre et Type de paramètre.

  7. Ajoutez un deuxième paramètre appelé yCoord (type OLE_YPOS_PIXELS).

  8. Cliquez sur Terminer pour créer l’événement.

Ajouter des modifications de l’Assistant Événements pour les événements personnalisés

Lorsque vous ajoutez un événement personnalisé, l’Assistant Ajouter un événement apporte des modifications à la classe de contrôle. H, . CPP, et . Fichiers IDL. Les exemples de code suivants sont spécifiques à l’événement ClickIn.

Les lignes suivantes sont ajoutées à l’en-tête (. Fichier H) de votre classe de contrôle :

void FireClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord)
{
   FireEvent(eventidClickIn, EVENT_PARAM(VTS_XPOS_PIXELS VTS_YPOS_PIXELS), xCoord, yCoord);
}

Ce code déclare une fonction inline appelée FireClickIn COleControl  ::FireEvent avec l’événement ClickIn et les paramètres que vous avez définis à l’aide de l’Assistant Ajouter un événement.

En outre, la ligne suivante est ajoutée à la carte d’événements du contrôle, située dans l’implémentation (. Fichier CPP) de votre classe de contrôle :

EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)

Ce code mappe l’événement ClickIn à la fonction FireClickIninline, en passant les paramètres que vous avez définis à l’aide de l’Assistant Ajouter un événement.

Enfin, la ligne suivante est ajoutée aux contrôles . Fichier IDL :

[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);

Cette ligne affecte à l’événement ClickIn un numéro d’ID spécifique, extrait de la position de l’événement dans la liste des événements Add Event Wizard. L’entrée dans la liste des événements permet à un conteneur d’anticiper l’événement. Par exemple, il peut fournir du code de gestionnaire à exécuter lorsque l’événement est déclenché.

Appel de FireClickIn

Maintenant que vous avez ajouté l’événement personnalisé ClickIn à l’aide de l’Assistant Ajouter un événement, vous devez décider quand cet événement doit être déclenché. Pour ce faire, appelez FireClickIn lorsque l’action appropriée se produit. Pour cette discussion, le contrôle utilise la InCircle fonction à l’intérieur d’un WM_LBUTTONDOWN gestionnaire de messages pour déclencher l’événement ClickIn lorsqu’un utilisateur clique à l’intérieur d’une région circulaire ou elliptique. La procédure suivante ajoute le WM_LBUTTONDOWN gestionnaire.

Pour ajouter un gestionnaire de messages avec l’Assistant Ajouter un événement

  1. Chargez votre projet de contrôle.

  2. En mode Classe, sélectionnez votre classe de contrôle ActiveX.

  3. Dans la fenêtre Propriétés , vous voyez une liste de messages qui peuvent être gérés par le contrôle ActiveX. Tout message affiché en gras a déjà une fonction de gestionnaire qui lui est affectée.

  4. Sélectionnez le message à gérer. Pour cet exemple, sélectionnez WM_LBUTTONDOWN.

  5. Dans la zone de liste déroulante à droite, sélectionnez <Ajouter> OnLButtonDown.

  6. Double-cliquez sur la nouvelle fonction de gestionnaire en mode Classe pour accéder au code du gestionnaire de messages dans l’implémentation (. Fichier CPP) de votre contrôle ActiveX.

L’exemple de code suivant appelle la InCircle fonction chaque fois que le bouton gauche de la souris est cliqué dans la fenêtre de contrôle. Cet exemple se trouve dans la WM_LBUTTONDOWN fonction gestionnaire, OnLButtonDowndans l’exemple abstrait Circ.

void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
   if (InCircle(point))
      FireClickIn(point.x, point.y);

   COleControl::OnLButtonDown(nFlags, point);
}

Remarque

Lorsque l’Assistant Ajouter un événement crée des gestionnaires de messages pour les actions de bouton de souris, un appel au même gestionnaire de messages de la classe de base est automatiquement ajouté. Ne supprimez pas cet appel. Si votre contrôle utilise l’un des messages de la souris stock, les gestionnaires de messages de la classe de base doivent être appelés pour s’assurer que la capture de la souris est gérée correctement.

Dans l’exemple suivant, l’événement se déclenche uniquement lorsque le clic se produit à l’intérieur d’une région circulaire ou elliptique dans le contrôle. Pour obtenir ce comportement, vous pouvez placer la fonction dans l’implémentation InCircle de votre contrôle (. Fichier CPP) :

VARIANT_BOOL CMyAxUICtrl::InCircle(CPoint& point)
{
   CRect rc;
   GetClientRect(rc);
   // Determine radii
   double a = (rc.right - rc.left) / 2;
   double b = (rc.bottom - rc.top) / 2;

   // Determine x, y
   double x = point.x - (rc.left + rc.right) / 2;
   double y = point.y - (rc.top + rc.bottom) / 2;

   // Apply ellipse formula
   return ((x * x) / (a * a) + (y * y) / (b * b) <= 1);
}

Vous devez également ajouter la déclaration suivante de la fonction à l’en-tête InCircle de votre contrôle (. Fichier H) :

VARIANT_BOOL InCircle(CPoint& point);

Événements personnalisés avec noms boursiers

Vous pouvez créer des événements personnalisés portant le même nom que les événements stock, mais vous ne pouvez pas implémenter les deux dans le même contrôle. Par exemple, vous pouvez créer un événement personnalisé appelé Click qui ne se déclenche pas lorsque l’événement boursier Click se déclenche normalement. Vous pouvez ensuite déclencher l’événement Click à tout moment en appelant sa fonction de déclenchement.

La procédure suivante ajoute un événement Click personnalisé.

Pour ajouter un événement personnalisé qui utilise un nom d’événement stock

  1. Chargez votre projet de contrôle.

  2. En mode Classe, cliquez avec le bouton droit sur votre classe de contrôle ActiveX pour ouvrir le menu contextuel.

  3. Dans le menu contextuel, cliquez sur Ajouter , puis sur Ajouter un événement.

    L’Assistant Ajouter un événement s’ouvre.

  4. Dans la liste déroulante Nom de l’événement, sélectionnez un nom d’événement stock. Pour cet exemple, sélectionnez Cliquer.

  5. Pour le type d’événement, sélectionnez Personnalisé.

  6. Cliquez sur Terminer pour créer l’événement.

  7. Appelez FireClick à des emplacements appropriés dans votre code.

Voir aussi

Contrôles ActiveX MFC
Contrôles ActiveX MFC : méthodes
COleControl, classe