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
Chargez votre projet de contrôle.
En mode Classe, cliquez avec le bouton droit sur votre classe de contrôle ActiveX pour ouvrir le menu contextuel.
Dans le menu contextuel, cliquez sur Ajouter , puis sur Ajouter un événement.
L’Assistant Ajouter un événement s’ouvre.
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.
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
).Ajoutez un paramètre appelé xCoord (type OLE_XPOS_PIXELS), à l’aide des contrôles Nom du paramètre et Type de paramètre.
Ajoutez un deuxième paramètre appelé yCoord (type OLE_YPOS_PIXELS).
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 FireClickIn
inline, 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
Chargez votre projet de contrôle.
En mode Classe, sélectionnez votre classe de contrôle ActiveX.
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.
Sélectionnez le message à gérer. Pour cet exemple, sélectionnez
WM_LBUTTONDOWN
.Dans la zone de liste déroulante à droite, sélectionnez <Ajouter> OnLButtonDown.
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, OnLButtonDown
dans 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
Chargez votre projet de contrôle.
En mode Classe, cliquez avec le bouton droit sur votre classe de contrôle ActiveX pour ouvrir le menu contextuel.
Dans le menu contextuel, cliquez sur Ajouter , puis sur Ajouter un événement.
L’Assistant Ajouter un événement s’ouvre.
Dans la liste déroulante Nom de l’événement, sélectionnez un nom d’événement stock. Pour cet exemple, sélectionnez Cliquer.
Pour le type d’événement, sélectionnez Personnalisé.
Cliquez sur Terminer pour créer l’événement.
Appelez
FireClick
à des emplacements appropriés dans votre code.
Voir aussi
Contrôles ActiveX MFC
Contrôles ActiveX MFC : méthodes
COleControl, classe