Schritt 4: Ändern des Zeichnungs-Codes

Standardmäßig zeigt der Zeichencode des Steuerelements ein Quadrat und den Text PolyCtl an.In diesem Schritt ändern Sie den Code, um interessanteres einige anzuzeigen.Die folgenden Aufgaben werden beteiligt:

  • Ändern der Headerdatei

  • Ändern der OnDraw-Funktion

  • Hinzufügen einer Methode, um die Polygon-Punkte zu berechnen

  • Initialisieren der Füllfarbe

Ändern der Headerdatei

Beginnen Sie, indem Sie Unterstützung für die mathematischen Funktionen sin und cos hinzufügen, die leiten die Polygonpunkte verwendet werden und mit einem Array erstellt, um Positionen zu speichern.

Um die Headerdatei ändern

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

    #include <math.h>
    #include "resource.h"       // main symbols
    
  2. Sobald die Polygonpunkte abgeleitet, werden sie in einem Array vom Typ POINT gespeichert, sodass fügen Sie das Array nach der Definition von m_nSides in PolyCtl.h hinzu:

    POINT m_arrPoint[100];
    

Ändern der OnDraw-Methode

Jetzt können Sie die OnDraw-Methode in PolyCtl.h ändern.Der Code, den Sie hinzufügen, erstellt einen neuen Stift und einen Pinsel erstellt, mit denen, das Polygon zu zeichnen und dann die Ellipse und Polygon Win32-API-Funktionen aufruft, um die tatsächliche Zeichnen auszuführen.

Um die OnDraw-Funktion ändern

  • Ersetzen Sie die vorhandene OnDraw-Methode in PolyCtl.h durch 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, um die Polygon-Punkte zu berechnen

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

Um die CalcPoints-Methode hinzufügen

  1. Fügen Sie die Deklaration von CalcPoints dem öffentlichen Abschnitt der IPolyCtlCPolyCtl-Klasse in PolyCtl.h hinzu:

    void CalcPoints(const RECT& rc);
    

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

       void FinalRelease()
       {
       }
    public:
       STDMETHOD(get_Sides)(short* pVal);
       STDMETHOD(put_Sides)(short newVal);
       void CalcPoints(const RECT& rc);
    
  2. Fügen Sie diese Implementierung der Funktion CalcPoints 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 Sie m_clrFillColor mit einer Standardfarbe.

Um die Füllfarbe initialisieren

  • Verwenden Sie grün, wie die Standardfarbe durch Hinzufügen dieser Zeile zum CPolyCtl-Konstruktor in PolyCtl.h:

    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- wird geschlossen, wenn sie immer noch geöffnet, und dann auf Polygon erstellen auf dem Menü Erstellen geklickt hat.Sie können das Steuerelement von der Seite PolyCtl.htm-, aber diese malverwendung noch einmal anzeigen der Testcontainer für ActiveX-Steuerelemente.

Um den Testcontainer für ActiveX-Steuerelemente verwenden

  1. Erstellen Sie den Testcontainer für ActiveX-Steuerelemente an.Weitere Informationen finden Sie unter TSTCON-Beispiel: Testcontainer für ActiveX-Steuerelemente.

  2. im Testcontainer auf dem Menü Bearbeiten, auf Neues Steuerelement einfügen.

  3. Suchen Sie das Steuerelement, das PolyCtl Class aufgerufen wird, und klicken Sie auf OK.Sie finden ein grünes Dreieck innerhalb eines Kreises.

Versuchen Sie, die Anzahl vonseiten zu ändern, indem Sie die folgende Prozedur befolgen.Um Eigenschaften auf einer dualen Schnittstelle aus Testcontainer zu ändern, verwenden Sie Invoke Methods.

Um die Eigenschaft eines Steuerelements aus dem Testcontainer ändern

  1. im Testcontainer klicken Sie auf Methoden aufrufen auf dem Menü System.

    Das Dialogfeld wird angezeigt. Methode aufrufen

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

  3. Typ 5Parameterwert im Feld auf, und klicken Sie auf Wert festgelegtAufrufen.

Beachten Sie, dass das Steuerelement nicht ändert.Obwohl Sie die Anzahl vonseiten intern ändern, indem Sie die m_nSides-Variable festlegen, dass diese nicht das Steuerelement neu zu zeichnen.Wenn Sie zu einer anderen Anwendung wechseln und zurück in Testcontainer wechseln, werden Sie feststellen, dass das Steuerelement die richtige Anzahl vonseiten neu gestrichelt und hat verfügt.

Um dieses Problem zu beheben, fügen Sie einen Aufruf der Funktion definiert FireViewChange hinzu, in IViewObjectExImpl, nach dem Festlegen der Anzahl vonseiten.Wenn das Steuerelement in ein eigenes Fenster ausgeführt wird, ruft die Methode FireViewChangeInvalidateRect direkt auf.Wenn das Steuerelement das Ausführen fensterlos ist, wird die InvalidateRect-Methode um der Siteschnittstelle des Containers aufgerufen.Dadurch wird das Steuerelement, sich neu zu zeichnen.

So fügen Sie einen Aufruf FireViewChange hinzufügen

  • Aktualisieren Sie PolyCtl.cpp, indem Sie den Aufruf in FireViewChange zur put_Sides-Methode hinzufügen.Wenn Sie damit 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"));
       }
    }
    

Nach dem FireViewChange hinzugefügt hat, versuchen Neukompilierungen und das Steuerelement noch einmal im Testcontainer für ActiveX-Steuerelemente.Dieses Mal, wenn Sie die Anzahl vonseiten ändern und auf Invoke klicken, sollten Sie die kann sofort anzeigen.

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

Zurück zu Schritt 3 | Klicken Sie zu Schritt 5

Siehe auch

Aufgaben

Tests-Eigenschaften und Ereignisse mit Testcontainer

Referenz

ATL-Lernprogramm