Ä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
FunktionHinzufü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
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
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 dieCPolyCtl
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)
Nachdem die Polygonpunkte berechnet wurden, werden sie in einem Array vom Typ
POINT
gespeichert. Fügen Sie daher das Array nach der Definitionsanweisungshort 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
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
Fügen Sie die Deklaration des
CalcPoints
IPolyCtl
öffentlichen Abschnitts derCPolyCtl
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);
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
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
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::CW2AEX
sind, ersetzen Sie die ZeileTRACE( "XActiveScriptSite::GetItemInfo( %s )\n", pszNameT );
durchTRACE( "XActiveScriptSite::GetItemInfo( %s )\n", pszNameT.m_psz );
, und zeilenTRACE( "Source Text: %s\n", COLE2CT( bstrSourceLineText ) );
mitTRACE( "Source Text: %s\n", bstrSourceLineText );
.
Öffnen Sie bei Fehlern, dieTCProps
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
Klicken Sie im Testcontainer im Menü "Bearbeiten" auf "Neues Steuerelement einfügen".
Suchen Sie Das Steuerelement, das aufgerufen
PolyCtl class
wird, 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
Klicken Sie im Testcontainer im Menü "Steuerelement" auf "Methoden aufrufen".
Das Dialogfeld " Methode aufrufen" wird angezeigt.
Wählen Sie die PropPut-Version der Sides-Eigenschaft im Dropdown-Listenfeld "Methodenname " aus.
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 IViewObjectExImpl
definiert 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
Aktualisieren Sie PolyCtl.cpp, indem Sie den Aufruf der
FireViewChange
put_Sides
Methode hinzufügen. Wenn Sie fertig sind, sollte dieput_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 FireViewChange
das 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