Ändern des Zeichencodes (ATL-Lernprogramm, Teil 4)
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
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
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
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);
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
Erstellen Sie den Testcontainer für ActiveX-Steuerelemente an. Weitere Informationen finden Sie unter TSTCON-Beispiel: Testcontainer für ActiveX-Steuerelemente.
im Testcontainer auf dem Menü Bearbeiten, auf Neues Steuerelement einfügen.
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
im Testcontainer klicken Sie auf Methoden aufrufen auf dem Menü System.
Das Dialogfeld wird angezeigt. Methode aufrufen
Wählen Sie die PropPut-Version der Sides-Eigenschaft vom Methodenname Dropdown-Listenfeld aus.
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
Testen der Eigenschaften und Ereignisse mit Test Container