Enthalten Sie in der Zeichnung Code, den Sie sin und cos Funktionen zum Berechnen der Polygonpunkte, so fügen Sie verwenden, math.h an der Spitze der PolyCtl.h:
# include lt;math.h >
# include "resource.h" / Main Symbole
Hinweis für Release baut nur&Nbsp; Wenn die ATL COM AppWizard Standardprojekt generiert, definiert es die Makros _ATL_MIN_CRT. Dieses Makro wird definiert, so dass Sie nicht der C Run-Time Bibliothek in Ihren Code bringen, wenn Sie es nicht brauchen. Das Polygon-Steuerelement benötigt der Startcode C Run-Time Bibliothek Gleitkommafunktionen initialisiert werden. Sie müssen daher das _ATL_MIN_CRT -Makro entfernen möchten, wenn Sie eine Releaseversion erstellen möchten. Um das Makro zu entfernen, klicken Sie auf Einstellungen im Menü Projekt . In den Einstellungen für: Dropdown-Liste, wählen Sie Mehrere Konfigurationen. Projekt-Konfigurationen zu ändern, wählen Sie im Dialogfeld, das angezeigt wird, klicken Sie auf die Kontrollkästchen für alle vier Versionen und dann auf OK. Wählen Sie auf der Registerkarte C/c++ die Kategorie Allgemein , dann entfernen Sie _ATL_MIN_CRT aus dem Eingabefeld Präprozessordefinitionen.
Nachdem die Polygonpunkte berechnet sind, speichern Sie die Punkte durch ein Array vom Typ POINT am Ende der Klassendefinition in PolyCtl.h hinzugefügt:
OLE_COLOR M_clrFillColor;
kurze M_nSides;
Punkt M_arrPoint [100]
Ändern Sie jetzt die OnDraw -Funktion in PolyCtl.h, unten übereinstimmen. Beachten Sie, dass Sie die Aufrufe an die Funktionen Rechteck und DrawText entfernen. Sie erhalten auch explizit und wählen Sie einen schwarzen Stift und weißen Pinsel. Sie müssen dies tun, für den Fall, dass Ihr Steuerelement fensterlos ausgeführt wird. Haben Sie Ihr eigenes Fenster, können nicht Sie Annahmen über den Gerätekontext, dass Sie zeichnen.
Die OnDraw sieht so aus:
HRESULT CPolyCtl::OnDraw(ATL_DRAWINFOamp; di)
{
RECT & Rc = *(RECT*)di.prcBounds;
HDC Hdc = di.hdcDraw;
COLORREF ColFore;
HBRUSH hOldBrush, hBrush;
HPEN hOldPen, hPen;
/ / Translate M_colFore in einen COLORREF-Typ
OleTranslateColor (M_clrFillColor, NULL, & ColFore);
/ / Erstellen und wählen Sie die Farben zum Zeichnen des Kreises
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);
/ / Erstellen und wählen Sie den Pinsel, der verwendet wird, um das Polygon füllen
hBrush = CreateSolidBrush(colFore);
AuswählenObjekt (Hdc, hBrush);
CalcPoints(rc);
Polygon (Hdc, & M_arrPoint [0], M_nSides);
/ / Wählen Sie die alte Stift und Pinsel zurück und löschen Sie den Pinsel, die wir erstellt
AuswählenObjekt (Hdc, hOldPen);
AuswählenObjekt (Hdc, hOldBrush);
DeleteObject(hBrush);
Gibt S_OK zurück.
}
Jetzt müsse&n Sie eine Funktion namens CalcPoints , berechnet, die die Koordinaten der Zeile intersections.nbsp; Diese Berechnungen stützt sich auf die RECT-Variablen, die an die Funktion übergeben wird. Zuerst sollten Sie die Definition des CalcPoints im öffentlichen Abschnitt der IPolyCtl-Klasse in das PolyCtl.h hinzufügen:
voidnbsp; CalcPoints (const RECT & rc)
Im öffentliche Abschnitt der Klasse IPolyCtl sollte jetzt so aussehen.:
/ / IPolyCtl
Öffentliche:
STDMETHOD(get_Sides) (/ * [out, Retval] * / kurze * NewVal);
STDMETHOD(put_Sides) (/ * [in] * / short NewVal);
Voidnbsp; CalcPoints (const RECT & rc)
Als Nächstes fügen Sie die Implementierung von der CalcPoints Funktion an das Ende der Datei PolyCtl.cpp:
void CPolyCtl::CalcPoints (const RECTamp; rc)
{
const double Pi = 3.14159265358979;
Punkt PtCenter;
Double DblRadiusx = (rc.right – rc.left) / 2;
Double DblRadiusy = (rc.bottom - rc.top) / 2;
Double DblAngle = 3 * Pi / 2; / / Start an der Spitze
Double DblDiff = 2 * Pi / M_nSides; / / Winkel jeder Seite machen
ptCenter.x = (rc.left + rc.right) / 2;
ptCenter.y = (rc.top + rc.bottom) / 2;
/ / Berechnen der Punkte für jede Seite
für (Int I = 0; i < M_nSides; i++)
{
M_arrPoint [i] .x = (lang) (DblRadiusx * cos(dblAngle) + ptCenter.x + 0.5);
.y M_arrPoint [i] = (lang) (DblRadiusy * sin(dblAngle) + ptCenter.y + 0.5);
DblAngle += DblDiff;
}
}
Nun initialisieren m_clrFillColor . Wählen Sie grün als Standardfarbe und fügen Sie diese Zeile, um den CPolyCtl Konstruktor in PolyCtl.h:
m_clrFillColor = RGB (0, 0xFF, 0)
Der Konstruktor sieht nun folgendermaßen aus.:
CPolyCtl()
{
M_nSides = 3;
M_clrFillColor = RGB (0, 0xFF, 0);
}
Jetzt erstellen Sie das Steuerelement neu und versuchen Sie es erneut. Öffnen Sie Testcontainer für ActiveX-Steuerelemente , und fügen Sie das Steuerelement. Es sollte ein grünes Dreieck in einem Kreis angezeigt. Versuchen Sie, die Anzahl der Seiten durch die folgenden Schritte aus. Verwenden Sie, um auf eine duale Schnittstelle von Test-ContainerEigenschaften ändern, Methoden aufrufen:

Beachten Sie, dass das Steuerelement nicht ändert. Was ist los? Obwohl Sie die Anzahl der Seiten, intern durch Festlegen geändert der m_nSides Variablen, Sie verursachen nicht das Steuerelement neu gezeichnet. Wenn Sie zu einer anderen Anwendung wechseln und dann wechseln Sie zurück zum Test-Container Sie, dass feststellen werden das Steuerelement wird aktualisiert und hat jetzt die richtige Anzahl von Seiten.
Um dieses Problem zu beheben, müssen Sie einen Aufruf an die FireViewChange -Funktion hinzufügen, die in IViewObjectExImpl, definiert ist, nachdem Sie die Anzahl der Seiten festgelegt. Wenn das Steuerelement in einem eigenen Fenster ausgeführt wird, wird die FireViewChange der InvalidateRect API direkt aufrufen. Wenn das Steuerelement fensterlos ausgeführt wird, wird die InvalidateRect -Methode auf der Website-Schnittstelle des Containers aufgerufen werden. Dies zwingt das Steuerelement sich selbst neu zeichnet.
Die neue put_Sides Methode ist wie folgt:
STDMETHODIMP-CPolyCtl::put_Sides(short newVal)
{
Wenn (NewVal Gt; 2 & & NewVal < 101)
{
M_nSides = neuerwert;
FireViewChange();
Gibt S_OK zurück.
}
anderes
Fehler zurück (_T ("Form muss zwischen 3 und 100 Seiten"));
}
Nachdem Sie FireViewChangehinzugefügt haben, neu erstellen und das Steuerelement erneut versuchen. Dieses Mal, wenn Sie die Anzahl der Seiten ändern und klicken Sie auf aufrufen, sehen Sie des Steuerelements sofort ändern.
Als nächstes werden Sie ein Ereignis an das Steuerelement hinzufügen.
Zurück zu Schritt 3 |nbsp; An Schritt 5