Hinzufügen eines Ereignisses (ATL-Lernprogramm, Teil 5)
In diesem Schritt fügen Sie Ihrem ATL-Steuerelement ein ClickIn
Ereignis und ein ClickOut
Ereignis hinzu. Sie werden das ClickIn
Ereignis auslösen, wenn der Benutzer innerhalb des Polygons klickt und ausgelöst ClickOut
wird, wenn der Benutzer außerhalb klickt. Die Aufgaben zum Hinzufügen eines Ereignisses lauten wie folgt:
Hinzufügen der
ClickIn
UndClickOut
MethodenGenerieren der Typbibliothek
Implementieren der Verbinden ionspunktschnittstellen
Hinzufügen der ClickIn- und ClickOut-Methoden
Wenn Sie das ATL-Steuerelement in Schritt 2 erstellt haben, haben Sie das Kontrollkästchen Verbinden Ionspunkte aktiviert. Dadurch wurde die _IPolyCtlEvents
Schnittstelle in der Datei Polygon.idl erstellt. Beachten Sie, dass der Schnittstellenname mit einem Unterstrich beginnt. Dies ist eine Konvention, um anzugeben, dass es sich bei der Schnittstelle um eine interne Schnittstelle handelt. Daher können Programme, mit denen Sie COM-Objekte durchsuchen können, die Benutzeroberfläche nicht für den Benutzer anzeigen. Beachten Sie außerdem, dass die Auswahl von Verbinden ionspunkten die folgende Zeile in der Datei Polygon.idl hinzugefügt hat, um anzugeben, dass es sich _IPolyCtlEvents
um die Standardquellschnittstelle handelt:
[default, source] dispinterface _IPolyCtlEvents;
Das Quellattribut gibt an, dass das Steuerelement die Quelle der Benachrichtigungen ist, sodass es diese Schnittstelle im Container aufruft.
Fügen Sie nun der _IPolyCtlEvents
Schnittstelle die ClickIn
Methoden und ClickOut
Methoden hinzu.
So fügen Sie die Methoden ClickIn und ClickOut hinzu
Öffnen Sie in Projektmappen-Explorer Polygon.idl, und fügen Sie den folgenden Code in
methods:
derdispInterface_IPolyCtlEvents
Deklaration der PolygonLib-Bibliothek hinzu:[id(1), helpstring("method ClickIn")] void ClickIn([in] LONG x,[in] LONG y); [id(2), helpstring("method ClickOut")] void ClickOut([in] LONG x,[in] LONG y);
Die ClickIn
Methoden ClickOut
übernehmen die x- und y-Koordinaten des geklickten Punkts als Parameter.
Generieren der Typbibliothek
Generieren Sie die Typbibliothek an diesem Punkt, da es vom Projekt verwendet wird, um die benötigten Informationen zu erhalten, um eine Verbindungspunktschnittstelle und eine Verbindungspunktcontainerschnittstelle für Ihr Steuerelement zu erstellen.
So generieren Sie die Typbibliothek
Erstellen Sie das Projekt neu.
Oder
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf die Datei Polygon.idl, und klicken Sie im Kontextmenü auf "Kompilieren".
Dadurch wird die Datei Polygon.tlb erstellt, die Ihre Typbibliothek ist. Die Polygon.tlb-Datei ist aus Projektmappen-Explorer nicht sichtbar, da es sich um eine Binärdatei handelt und nicht direkt angezeigt oder bearbeitet werden kann.
Implementieren der Verbinden ionspunktschnittstellen
Implementieren Sie eine Verbindungspunktschnittstelle und eine Verbindungspunktcontainerschnittstelle für Ihr Steuerelement. In COM werden Ereignisse über den Mechanismus von Verbindungspunkten implementiert. Um Ereignisse von einem COM-Objekt zu empfangen, stellt ein Container eine Empfehlungsverbindung mit dem Verbindungspunkt her, den das COM-Objekt implementiert. Da ein COM-Objekt mehrere Verbindungspunkte aufweisen kann, implementiert das COM-Objekt auch eine Verbindungspunktcontainerschnittstelle. Über diese Schnittstelle kann der Container bestimmen, welche Verbindungspunkte unterstützt werden.
Die Schnittstelle, die einen Verbindungspunkt implementiert, wird aufgerufen IConnectionPoint
, und die Schnittstelle, die einen Verbindungspunktcontainer implementiert, wird aufgerufen IConnectionPointContainer
.
Um die Implementierung zu unterstützenIConnectionPoint
, verwenden Sie den Assistenten zum Implementieren von Verbinden ionspunkt. Dieser Assistent generiert die IConnectionPoint
Schnittstelle, indem Sie Ihre Typbibliothek lesen und eine Funktion für jedes Ereignis implementieren, das ausgelöst werden kann.
So implementieren Sie die Verbindungspunkte
Öffnen Sie in Projektmappen-Explorer _IPolyCtlEvents_CP.h, und fügen Sie den folgenden Code unter der Anweisung in der
public:
CProxy_IPolyCtlEvents
Klasse hinzu:VOID Fire_ClickIn(LONG x, LONG y) { T* pT = static_cast<T*>(this); int nConnectionIndex; CComVariant* pvars = new CComVariant[2]; int nConnections = m_vec.GetSize(); for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) { pT->Lock(); CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex); pT->Unlock(); IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p); if (pDispatch != NULL) { pvars[1].vt = VT_I4; pvars[1].lVal = x; pvars[0].vt = VT_I4; pvars[0].lVal = y; DISPPARAMS disp = { pvars, NULL, 2, 0 }; pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); } } delete[] pvars; } VOID Fire_ClickOut(LONG x, LONG y) { T* pT = static_cast<T*>(this); int nConnectionIndex; CComVariant* pvars = new CComVariant[2]; int nConnections = m_vec.GetSize(); for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) { pT->Lock(); CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex); pT->Unlock(); IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p); if (pDispatch != NULL) { pvars[1].vt = VT_I4; pvars[1].lVal = x; pvars[0].vt = VT_I4; pvars[0].lVal = y; DISPPARAMS disp = { pvars, NULL, 2, 0 }; pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); } } delete[] pvars; }
Sie werden sehen, dass diese Datei eine Klasse hat, die aufgerufen CProxy_IPolyCtlEvents
wird, von IConnectionPointImpl
der abgeleitet wird. _IPolyCtlEvents_CP.h definiert nun die beiden Methoden Fire_ClickIn
und Fire_ClickOut
verwendet die beiden Koordinatenparameter. Sie rufen diese Methoden auf, wenn Sie ein Ereignis aus Ihrem Steuerelement auslösen möchten.
Durch das Erstellen des Steuerelements mit ausgewählter Option Verbinden ionspunkte wurde die Datei _IPolyCtlEvents_CP.h für Sie generiert. Außerdem wurde sie der mehrfachen Vererbungsliste Ihres Steuerelements hinzugefügt CProxy_PolyEvents
IConnectionPointContainerImpl
und für Sie verfügbar gemacht IConnectionPointContainer
, indem sie der COM-Zuordnung entsprechende Einträge hinzufügen.
Sie sind damit fertig, den Code zur Unterstützung von Ereignissen zu implementieren. Fügen Sie nun Code hinzu, um die Ereignisse im entsprechenden Moment auszulöschen. Denken Sie daran, dass Sie ein ClickIn
Ereignis auslösen, ClickOut
wenn der Benutzer auf die linke Maustaste im Steuerelement klickt. Um herauszufinden, wann der Benutzer auf die Schaltfläche klickt, fügen Sie einen Handler für die WM_LBUTTONDOWN
Nachricht hinzu.
So fügen Sie einen Handler für die WM_LBUTTONDOWN Nachricht hinzu
Klicken Sie in der Klassenansicht mit der rechten Maustaste auf die
CPolyCtl
Klasse, und klicken Sie im Kontextmenü auf "Eigenschaften ".Klicken Sie im Eigenschaftenfenster auf das Symbol "Nachrichten " und dann
WM_LBUTTONDOWN
in der Liste auf der linken Seite.Klicken Sie in der angezeigten Dropdownliste auf <"OnLButtonDown hinzufügen>". Die
OnLButtonDown
Handlerdeklaration wird polyCtl.h hinzugefügt, und die Handlerimplementierung wird polyCtl.cpp hinzugefügt.
Ändern Sie als Nächstes den Handler.
So ändern Sie die OnLButtonDown-Methode
Ändern Sie den Code, der die
OnLButtonDown
Methode in PolyCtl.cpp umfasst (löschen Sie den vom Assistenten platzierten Code), sodass er wie folgt aussieht:LRESULT CPolyCtl::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) { HRGN hRgn; WORD xPos = LOWORD(lParam); // horizontal position of cursor WORD yPos = HIWORD(lParam); // vertical position of cursor CalcPoints(m_rcPos); // Create a region from our list of points hRgn = CreatePolygonRgn(&m_arrPoint[0], m_nSides, WINDING); // If the clicked point is in our polygon then fire the ClickIn // event otherwise we fire the ClickOut event if (PtInRegion(hRgn, xPos, yPos)) Fire_ClickIn(xPos, yPos); else Fire_ClickOut(xPos, yPos); // Delete the region that we created DeleteObject(hRgn); return 0; }
Dieser Code verwendet die in der OnDraw
Funktion berechneten Punkte, um einen Bereich zu erstellen, der die Mausklicks des Benutzers mit dem Aufruf PtInRegion
erkennt.
Der Parameter "uMsg " ist die ID der Windows-Nachricht, die verarbeitet wird. Auf diese Weise können Sie über eine Funktion verfügen, die einen Bereich von Nachrichten behandelt. Die Parameter "wParam " und "lParam " sind die Standardwerte für die verarbeitete Nachricht. Mit dem Parameter "bHandled " können Sie angeben, ob die Funktion die Nachricht behandelt hat oder nicht. Standardmäßig ist der Wert auf TRUE festgelegt, um anzugeben, dass die Funktion die Nachricht behandelt hat, aber Sie können ihn auf FALSE festlegen. Dies führt dazu, dass ATL weiterhin nach einer anderen Nachrichtenhandlerfunktion sucht, an die die Nachricht gesendet wird.
Erstellen und Testen des Steuerelements
Probieren Sie jetzt Ihre Ereignisse aus. Erstellen Sie das Steuerelement, und starten Sie den ActiveX-Steuerelementtestcontainer erneut. Zeigen Sie dieses Mal das Ereignisprotokollfenster an. Um Ereignisse an das Ausgabefenster weiterzuleiten, klicken Sie im Menü "Optionen" auf "Protokollierung", und wählen Sie "Protokoll zum Ausgabefenster" aus. Fügen Sie das Steuerelement ein, und klicken Sie in das Fenster. Beachten Sie, dass ClickIn
ausgelöst wird, wenn Sie innerhalb des gefüllten Polygons klicken und ClickOut
ausgelöst werden, wenn Sie außerhalb des Polygons klicken.
Als Nächstes fügen Sie eine Eigenschaftenseite hinzu.
Zurück zu Schritt 4 | Bei Schritt 6
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für