Ändern des Zeichencodes (ATL-Lernprogramm, Teil 4)

Standardmäßig zeigt der Zeichnungscode des Steuerelements ein Quadrat und den Text PolyCtl an. In diesem Schritt ändern Sie den Code so, dass etwas interessanter angezeigt wird. Die folgenden Aufgaben sind beteiligt:

  • Ändern der Headerdatei

  • Ändern der OnDraw Funktion

  • Hinzufügen einer Methode zum Berechnen der Polygonpunkte

  • Initialisieren der Füllfarbe

Ändern der Headerdatei

Beginnen Sie mit dem Hinzufügen der Unterstützung für die mathematischen Funktionen sin und cos, die zum Berechnen der Polygonpunkte verwendet werden, und indem Sie ein Array zum Speichern von Positionen erstellen.

So ändern Sie die Headerdatei

  1. Fügen Sie die Zeile #include <math.h> am Anfang von PolyCtl.h hinzu. Der Anfang der Datei sollte wie folgt aussehen:

    #include <math.h>
    #include "resource.h"       // main symbols
    
  2. Implementieren Sie die IProvideClassInfo Schnittstelle, um Methodeninformationen für das Steuerelement bereitzustellen, indem Sie den folgenden Code zu PolyCtl.h hinzufügen. Ersetzen Sie in der Klasse die CPolyCtl Zeile:

    public CComControl<CPolyCtl>
    

    durch

    public CComControl<CPolyCtl>,
    public IProvideClassInfo2Impl<&CLSID_PolyCtl, &DIID__IPolyCtlEvents, &LIBID_PolygonLib>
    

    und in BEGIN_COM_MAP(CPolyCtl), fügen Sie die Zeilen hinzu:

    COM_INTERFACE_ENTRY(IProvideClassInfo)
    COM_INTERFACE_ENTRY(IProvideClassInfo2)
    
  3. Nachdem die Polygonpunkte berechnet wurden, werden sie in einem Array vom Typ POINTgespeichert. Fügen Sie daher das Array nach der Definitionsanweisung short m_nSides; in PolyCtl.h hinzu:

    POINT m_arrPoint[100];
    

Ändern der OnDraw-Methode

Jetzt sollten Sie die OnDraw Methode in PolyCtl.h ändern. Der Code, den Sie hinzufügen, erstellt einen neuen Stift und Pinsel, mit dem Das Polygon gezeichnet werden soll, und ruft dann die Ellipse Und Polygon Win32-API-Funktionen auf, um die eigentliche Zeichnung auszuführen.

So ändern Sie die OnDraw-Funktion

  1. Ersetzen Sie die vorhandene OnDraw Methode in PolyCtl.h durch den folgenden Code:

    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;
    }
    

Hinzufügen einer Methode zum Berechnen der Polygonpunkte

Fügen Sie eine Methode hinzu CalcPoints, die die Koordinaten der Punkte berechnet, die den Umkreis des Polygons bilden. Diese Berechnungen basieren auf der RECT-Variable, die an die Funktion übergeben wird.

So fügen Sie die CalcPoints-Methode hinzu

  1. Fügen Sie die Deklaration des CalcPointsIPolyCtl öffentlichen Abschnitts der CPolyCtl Klasse in PolyCtl.h hinzu:

    void CalcPoints(const RECT& rc);
    

    Der letzte Teil des öffentlichen Abschnitts der CPolyCtl Klasse sieht wie folgt aus:

       void FinalRelease()
       {
       }
    public:
       void CalcPoints(const RECT& rc);
    
  2. Fügen Sie diese Implementierung der CalcPoints Funktion am Ende von PolyCtl.cpp hinzu:

    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;
       }
    }
    

Initialisieren der Füllfarbe

Initialisieren m_clrFillColor sie mit einer Standardfarbe.

So initialisieren Sie die Füllfarbe

  1. Verwenden Sie Grün als Standardfarbe, indem Sie diese Linie dem CPolyCtl Konstruktor in PolyCtl.h hinzufügen:

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

Der Konstruktor sieht nun wie folgt aus:

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

Erstellen und Testen des Steuerelements

Erstellen Sie das Steuerelement neu. Stellen Sie sicher, dass die Datei PolyCtl.htm geschlossen ist, wenn sie noch geöffnet ist, und klicken Sie dann im Menü "Erstellen" auf "Polygon erstellen". Sie können das Steuerelement erneut auf der Seite PolyCtl.htm anzeigen, aber diesmal den ActiveX-Steuerelementtestcontainer verwenden.

So verwenden Sie den ActiveX-Steuerelementtestcontainer

  1. Erstellen und starten Sie den ActiveX-Steuerelementtestcontainer. Das TSTCON-Beispiel: ActiveX Control Test Container finden Sie auf GitHub.

    Hinweis

    Bei Fehlern, die in Script.Cpp enthalten ATL::CW2AEXsind, ersetzen Sie die Zeile TRACE( "XActiveScriptSite::GetItemInfo( %s )\n", pszNameT ); durch TRACE( "XActiveScriptSite::GetItemInfo( %s )\n", pszNameT.m_psz );, und zeilen TRACE( "Source Text: %s\n", COLE2CT( bstrSourceLineText ) ); mit TRACE( "Source Text: %s\n", bstrSourceLineText );.
    Öffnen Sie bei Fehlern, die TCProps stdAfx.h im Projekt betreffenHMONITOR, und ersetzen Sie Folgendes:

    #ifndef WINVER
    #define WINVER 0x0400
    #endif
    

    durch

    #ifndef WINVER
    #define WINVER 0x0500
    #define _WIN32_WINNT 0x0500
    #endif
    
  2. Klicken Sie im Testcontainer im Menü "Bearbeiten" auf "Neues Steuerelement einfügen".

  3. Suchen Sie Das Steuerelement, das aufgerufen PolyCtl classwird, und klicken Sie auf "OK". Sie sehen ein grünes Dreieck innerhalb eines Kreises.

Versuchen Sie, die Anzahl der Seiten zu ändern, indem Sie das nächste Verfahren ausführen. Verwenden Sie Invoke-Methoden, um Eigenschaften für eine duale Schnittstelle innerhalb des Testcontainers zu ändern.

So ändern Sie die Eigenschaft eines Steuerelements aus dem Testcontainer

  1. Klicken Sie im Testcontainer im Menü "Steuerelement" auf "Methoden aufrufen".

    Das Dialogfeld " Methode aufrufen" wird angezeigt.

  2. Wählen Sie die PropPut-Version der Sides-Eigenschaft im Dropdown-Listenfeld "Methodenname " aus.

  3. Geben Sie 5 das Feld "Parameterwert " ein, klicken Sie auf "Wert festlegen", und klicken Sie auf "Aufrufen".

Beachten Sie, dass sich das Steuerelement nicht ändert. Obwohl Sie die Anzahl der Seiten intern geändert haben, indem Sie die m_nSides Variable festlegen, hat dies nicht dazu führen, dass das Steuerelement neu gezählt wird. Wenn Sie zu einer anderen Anwendung wechseln und dann zurück zum Testcontainer wechseln, werden Sie feststellen, dass das Steuerelement aktualisiert wurde und die richtige Anzahl von Seiten aufweist.

Um dieses Problem zu beheben, fügen Sie einen Aufruf der Funktion hinzu, die FireViewChange in IViewObjectExImpldefiniert ist, nachdem Sie die Anzahl der Seiten festgelegt haben. Wenn das Steuerelement in einem eigenen Fenster ausgeführt wird, FireViewChange wird die InvalidateRect Methode direkt aufgerufen. Wenn das Steuerelement fensterlos ausgeführt wird, wird die InvalidateRect Methode auf der Websiteschnittstelle des Containers aufgerufen. Dadurch wird das Steuerelement gezwungen, sich neu zu bemalen.

So fügen Sie einen Anruf bei FireViewChange hinzu

  1. Aktualisieren Sie PolyCtl.cpp, indem Sie den Aufruf der FireViewChangeput_Sides Methode hinzufügen. Wenn Sie fertig sind, sollte die put_Sides Methode wie folgt aussehen:

    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"));
       }
    }
    

Erstellen Sie nach dem Hinzufügen FireViewChangedas Steuerelement neu, und versuchen Sie es erneut im ActiveX-Steuerelementtestcontainer. Dieses Mal, wenn Sie die Anzahl der Seiten ändern und auf klicken Invoke, sollte die Steuerelementänderung sofort angezeigt werden.

Im nächsten Schritt fügen Sie ein Ereignis hinzu.

Zurück zu Schritt 3 | Zu Schritt 5

Siehe auch

Tutorial
Testen der Eigenschaften und Ereignisse mit Test Container