Share via


Étape 4 : modifier le code de dessin

Par défaut, le code de dessin du contrôle affiche un carré et le texte PolyCtl. Dans cette étape, vous allez modifier le code pour afficher un nom plus intéressante. Les tâches suivantes sont impliqués :

  • Modifier le fichier d'en-tête

  • Modifier la fonction d' OnDraw

  • Ajouter une méthode pour calculer les points polygon

  • Initialiser la couleur de remplissage

Modifier le fichier d'en-tête

Commencez par ajouter la prise en charge des fonctions mathématiques sin et cos, qui seront utilisés calculent les points de polygone, et en créant un tableau pour stocker des positions.

Pour modifier le fichier d'en-tête

  1. Ajoutez la ligne #include <math.h> en haut de PolyCtl.h. Le début du fichier doit ressembler à ceci :

    #include <math.h>
    #include "resource.h"        // main symbols
    
  2. Une fois les points polygon sont calculées, ils seront stockés dans un tableau de type POINTpar conséquent, ajoutez le tableau après la définition d' m_nSides dans PolyCtl.h :

    POINT m_arrPoint[100];
    

Modifier la méthode d'OnDraw

Maintenant vous devez modifier la méthode d' OnDraw dans PolyCtl.h. Le code que vous ajouterez crée un stylet et le pinceau avec lequel dessiner le polygone, puis appelle Ellipse et l'API Win32 d' Polygon fonctionne pour effectuer le dessin proprement dit.

Pour modifier la fonction d'OnDraw

  • Remplacez la méthode existante d' OnDraw dans PolyCtl.h par le code suivant :

    HRESULT CPolyCtl::OnDraw(ATL_DRAWINFO& di)
    {
       RECT& rc = *(RECT*)di.prcBounds;
       HDC hdc  = di.hdcDraw;
    
       COLORREF    colFore;
       HBRUSH      hOldBrush, hBrush;
       HPEN        hOldPen, hPen;
    
       // Translate m_colFore into a COLORREF type
       OleTranslateColor(m_clrFillColor, NULL, &colFore);
    
       // Create and select the colors to draw the circle
       hPen = (HPEN)GetStockObject(BLACK_PEN);
       hOldPen = (HPEN)SelectObject(hdc, hPen);
       hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
       hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
    
       Ellipse(hdc, rc.left, rc.top, rc.right, rc.bottom);
    
       // Create and select the brush that will be used to fill the polygon
       hBrush    = CreateSolidBrush(colFore);
       SelectObject(hdc, hBrush);
    
       CalcPoints(rc);
       Polygon(hdc, &m_arrPoint[0], m_nSides);
    
       // Select back the old pen and brush and delete the brush we created
       SelectObject(hdc, hOldPen);
       SelectObject(hdc, hOldBrush);
       DeleteObject(hBrush);
    
       return S_OK;
    }
    

Ajouter une méthode pour calculer les points polygon

Ajoutez une méthode, CalcPointsappelé, qui calculera les coordonnées des points qui composent le périmètre de le polygone. Ces calculs sont basés sur la variable RECT passé dans la fonction.

Pour ajouter la méthode de CalcPoints

  1. Ajoutez la déclaration d' CalcPoints à la section publique d' IPolyCtl de la classe d' CPolyCtl dans PolyCtl.h :

    void CalcPoints(const RECT& rc);
    

    La dernière partie de la section publique de la classe d' CPolyCtl se présentera comme suit :

       void FinalRelease()
       {
       }
    public:
       STDMETHOD(get_Sides)(short* pVal);
       STDMETHOD(put_Sides)(short newVal);
       void CalcPoints(const RECT& rc);
    
  2. Ajoutez cette implémentation de la fonction d' CalcPoints à la fin de PolyCtl.cpp :

    void CPolyCtl::CalcPoints(const RECT& rc)
    {
       const double pi = 3.14159265358979;
       POINT   ptCenter;
       double  dblRadiusx = (rc.right - rc.left) / 2;
       double  dblRadiusy = (rc.bottom - rc.top) / 2;
       double  dblAngle = 3 * pi / 2;          // Start at the top 
       double  dblDiff  = 2 * pi / m_nSides;   // Angle each side will make
       ptCenter.x = (rc.left + rc.right) / 2;
       ptCenter.y = (rc.top + rc.bottom) / 2;
    
       // Calculate the points for each side 
       for (int i = 0; i < m_nSides; i++)
       {
          m_arrPoint[i].x = (long)(dblRadiusx * cos(dblAngle) + ptCenter.x + 0.5);
          m_arrPoint[i].y = (long)(dblRadiusy * sin(dblAngle) + ptCenter.y + 0.5);
          dblAngle += dblDiff;
       }
    }
    

Initialiser la couleur de remplissage

Initialisez m_clrFillColor avec une couleur par défaut.

Pour initialiser la couleur de remplissage

  • Utilisez le vert comme la couleur par défaut en ajoutant cette ligne au constructeur d' CPolyCtl dans PolyCtl.h :

    m_clrFillColor = RGB(0, 0xFF, 0);
    

Recherche de constructeur maintenant comme suit :

CPolyCtl()
{
   m_nSides = 3;
   m_clrFillColor = RGB(0, 0xFF, 0);
}

Génération et test du contrôle

Régénérez le contrôle. Assurez -vous que le fichier PolyCtl.htm est fermé s'il est ouvert, puis cliquez sur Générez le polygone dans le menu Générer . Vous pouvez afficher le contrôle à nouveau de la page PolyCtl.htm, mais cette utilisation de fois ActiveX Control Test Container.

Pour utiliser ActiveX Control Test Container

  1. Générez et démarrez ActiveX Control Test Container. Pour plus d'informations, consultez l' Exemple TSTCON : ActiveX Control Test Container.

  2. Dans l'outil Test Container, dans le menu Modifier , cliquez sur Contrôle d'insertion.

  3. Localisez votre contrôle, qui sera appelé PolyCtl Class, puis cliquez sur OK. Vous verrez un triangle vert dans un cercle.

Essayez de modifier le nombre de côtés en suivant la procédure suivante. Pour modifier des propriétés sur une interface double de Test Container, utilisez Invoke Methods.

Pour modifier la propriété d'un contrôle de Test Container

  1. Dans l'outil Test Container, cliquez sur appelez les méthodes dans le menu contrôle .

    La boîte de dialogue appelez la méthode s'affiche.

  2. Sélectionnez la version d' PropPut de la propriété d' Sides de la zone de liste déroulante Nom de la méthode .

  3. Tapez 5 dans la zone Valeur du paramètre , cliquez sur Valeur Set, puis cliquez sur Appeler.

Notez que le contrôle ne change pas. Bien que vous ayez modifié le nombre de côtés en interne en définissant la variable d' m_nSides , cela n'a pas effectué la redessiner le contrôle. Si vous basculez vers une autre application puis basculez vers Test Container, vous constaterez que le contrôle est redessiné et a le nombre correct de côté.

Pour résoudre ce problème, ajoutez un appel à la fonction d' FireViewChange , définie dans IViewObjectExImpl, après avoir défini le nombre de côtés. Si le contrôle s'exécute dans sa propre fenêtre, FireViewChange appelle la méthode d' InvalidateRect directement. Si le contrôle est exécuter sans fenêtre, la méthode d' InvalidateRect sera appelée sur l'interface du site du conteneur. Cela force le contrôle se repeindre.

Pour ajouter un appel à FireViewChange

  • Mettez à jour PolyCtl.cpp en ajoutant l'appel à FireViewChange à la méthode d' put_Sides . Lorsque vous avez terminé, la méthode d' put_Sides doit ressembler à ceci :

    STDMETHODIMP CPolyCtl::put_Sides(short newVal)
    {
       if (2 < newVal && newVal < 101)
       {
          m_nSides = newVal;
          FireViewChange();
          return S_OK;
       }
       else
       {
          return Error(_T("Shape must have between 3 and 100 sides"));
       }
    }
    

Après avoir ajouté FireViewChange, la régénération et testez le contrôle de nouveau dans ActiveX Control Test Container. Ce moment où vous modifiez le nombre de côtés et cliquez sur Invoke, vous devez voir l'arrêt du contrôle immédiatement.

Dans l'étape suivante, vous allez ajouter un événement.

Pour revenir à l'étape 3 | Sur à l'étape 5

Voir aussi

Tâches

propriétés et événements de test avec Test Container

Référence

Didacticiel ATL