Étape 5: Ajout d'un événement

Maintenant, vous allez ajouter un ClickIn et un ClickOut événement à votre contrôle ATL. Vous déclenche le ClickIn si l'utilisateur clique dans le polygone et le feu ClickOut si l'utilisateur clique à l'extérieur.

Lorsque vous avez créé le contrôle complet à l'étape 2, vous avez sélectionné les Points de connexion de soutien cocher box.nbsp ; Cela a créé la IPolyCtlEvents interface dans le fichier .idl.  &Notez que le nom de l'interface commence avec un trait de soulignement. Il s'agit d'une convention pour indiquer que l'interface est une interface interne. Ainsi, les programmes qui vous permettent de parcourir les objets COM peuvent choisir de ne pas afficher l'interface de l'utilisateur. Aussi avis dans le fichier .idl que Points de connexion de soutien ajoute une ligne pour indiquer que IPolyCtlEvents est l'interface source par défaut. L'attribut de la source indique que le contrôle est la source des notifications, il appelle cette interface sur le conteneur.

Maintenant, vous devez ajouter les méthodes ClickIn et ClickOut pour la IPolyCtlEvents interface:

  1. Cliquez avec le bouton droit sur IPolyCtlEvents dans ClassView et sélectionner Ajouter Method… dans le menu contextuel.

  2. Sélectionnez un Type de retour devoid.

  3. Type de ClickIn dans la zone Nom de la méthode.

  4. Entrez [in] long x, [in] long y dans la zone paramètres.

  5. Cliquez sur OK.

Vérifiez le fichier .idl à voir que le code a été ajouté comme u&ne méthode à la IPolyCtlEvents dispinterface.nbsp ; Puis utilisez la même procédure pour définir une ClickOut méthode, avec les mêmes paramètres et le type de retour.  La dispinterface IPolyCtlEvents dans votre fichier .idl devrait maintenant ressembler à ceci:

dispinterface _IPolyCtlEvents
{
   propriétés :
   méthodes :
   [id(1), helpstring ("méthode ClickIn")] void ClickIn ([in] long x, [en] y long) ;
   [id(2), helpstring ("méthode ClickOut")] void ClickOut ([in] long x, [en] y long) ;
}

Les ClickIn et ClickOut coordonne les méthodes qui prennent des x et y du point cliqué comme paramètres.

Maintenant générer votre bibliothèque de types. Pour ce faire, vous pouvez soit reconstruire votre projet ou un clic droit sur le fichier .idl FileView et cliquez sur Compiler Polygon.idl. Cela va créer le fichier Polygon.tlb, qui est votre bibliothèque de type.

Ensuite, mettre en œuvre une interface de point de connexion et une interface conteneur du point de connexion pour votre contrôle. (Dans COM, événements sont implémentés par le biais du mécanisme de points de connexion. Pour recevoir des événements à partir d'un objet COM, un conteneur établit une connexion au point de connexion qui implémente l'objet COM. Étant donné un objet COM peut avoir plusieurs points de connexion, l'objet COM implémente également une interface conteneur du point de connexion. Grâce à cette interface, le conteneur peut déterminer les points de connexion sont pris en charge.) L'interface qui implémente un point de connexion est appelé IConnectionPoint et l'interface qui implémente un conteneur de point de connexion est appelé IConnectionPointContainer.

Pour aider à mettre en œuvre IConnectionPoint, utilisez ClassView pour accéder à un assistant de point de connexion. L'Assistant génère l'interface IConnectionPoint par la lecture de votre bibliothèque de types et de mise en œuvre d'une fonction pour chaque événement peut être déclenché.

Pour exécuter l'Assistant, procédez comme suit:

  1. Allez dans ClassView (dans le menu affichage , cliquez sur espace de travail de voir ClassView).

  2. Cliquez avec le bouton droit sur la classe d'implémentation de votre contrôle, dans ce cas CPolyCtl.

  3. Dans le menu contextuel, sélectionnez Mettre connexion Canada….

  4. Sélectionnez _PolyEvents dans la liste Interfaces puis cliquez sur OK et une classe proxy pour le point de connexion seront générés, dans ce cas, CProxy_IPolyCtlEvents.

Si vous examinez le fichier PolygonCP.h généré dans FileView, vous voyez il a une classe appelée CProxy_PolyCtlEvents qui dérive de IConnectionPointImpl. PolygonCP.h définit également les deux méthodes Fire_ClickIn et Fire_ClickOut , qui prennent les deux paramètres des coordonnées. Ce sont les méthodes que vous appelez quand vous voulez déclencher un événement de votre contrôle.

L'Assista&nt ajoute la CProxy_PolyEvents et IConnectionPointContainerImpl à multiple héritage list.nbsp votre contrôle ; L'Assistant a aussi exposé IConnectionPointContainer pour vous en ajoutant des entrées appropriées à la carte COM.

Vous avez terminé, le code à l'appui des activités de mise en œuvre. Maintenant, ajouter du code pour les événements d'incendie au moment approprié. &N'oubliez pas, vous allez tirer un ClickIn ou ClickOut événement lorsque l'utilisateur clique sur le bouton gauche de la souris dans le contrôle. Pour savoir quand l'utilisateur clique sur le bouton, tout d'abord ajouter un gestionnaire d'événements pour le message WM_LBUTTONDOWN . Dans ClassView, cliquez avec le bouton droit sur la classe CPolyCtl et sélectionnez Ajouter Windows Message Handler... dans le raccourci menu.nbsp ; Puis sélectionnez WM_LBUTTONDOWN dans la liste de gauche et cliquez sur le bouton Ajouter le gestionnaire d'événements .  Cliquez sur OK.

Ensuite, ajoutez de nouveau code de la fonction OnLButtonDown dans PolyCtl.h (suppression de tout code placé par l'Assistant) pour que OnLButtonDown ressemble maintenant à ceci:

LRESULT CPolyCtl::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOLamp; bHandled)
{
   HRGN hRgn ;
   MOT posx = LOWORD(lParam) ;  / / horizontale position du curseur
   MOT yPos = HIWORD(lParam) ;  / / vertical position du curseur

CalcPoints(m_rcPos) ;

/ / Créer une région de notre liste de points
   hRgn = CreatePolygonRgn (& m_arrPoint [0], m_nSides, enroulement) ;

/ / Si le point cliqué dans notre polygone puis incendie le ClickIn
   / / événement sinon nous déclenche l'événement ClickOut
   Si (PtInRegion (hRgn, Posx, Posy))
      Fire_ClickIn (Posx, Posy) ;
   autre
      Fire_ClickOut (Posx, Posy) ;

/ / Supprimer la région que nous avons créé
   DeleteObject(hRgn) ;
   return 0 ;
}

Puisque vous avez déjà calculé les points du polygone dans la OnDraw fonction, de les utiliser dans OnLButtonDown pour créer une région. Ensuite, utilisez la fonction PtInRegion API pour déterminer si le point cliqué est à l'intérieur du polygone ou pas.

La uMsg paramètre correspond à l'ID du message Windows géré. Cela vous permet d'avoir une fonction qui gère une gamme de messages. Le wParam et le lParam sont les valeurs standard pour le message manipulé. Le paramètre bHandled permet de spécifier si la fonction a géré le message ou non. Par défaut, la valeur est définie sur TRUE pour indiquer que la fonction a géré le message, mais vous pouvez le définir sur fausse. Cela entraînera ATL continuer la recherche d'une autre fonction de gestionnaire de messages à laquelle envoyer le message.

Essayez maintenant vos événements. Renforcer le contrôle et recommencer ActiveX Control Test Container . Cette fois, voir la window.nbsp du journal des événements ; Pour router des événements dans la fenêtre sortie, sélectionnez connexion dans le menu Options et sélectionnez le Journal de la fenêtre Sortie. Maintenant, insérez le contrôle et essayez en cliquant dans la fenêtre. &Notez que ClickIn est déclenché si vous cliquez à l'intérieur du polygone rempli et ClickOut est déclenché lorsque vous cliquez à l'extérieur de celle-ci.

Ensuite, vous ajouterez une page de propriétés.

Retour à l'étape 4 |nbsp ; Sur l'étape 6

Index