É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
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
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
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);
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
Générez et démarrez ActiveX Control Test Container. Pour plus d'informations, consultez l' Exemple TSTCON : ActiveX Control Test Container.
Dans l'outil Test Container, dans le menu Modifier , cliquez sur Contrôle d'insertion.
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
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.
Sélectionnez la version d' PropPut de la propriété d' Sides de la zone de liste déroulante Nom de la méthode .
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