Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
ClickInUndClickOutMethodenGenerieren der Typbibliothek
Implementieren der Verbindungspunktschnittstellen
Hinzufügen der ClickIn- und ClickOut-Methoden
Wenn Sie das ATL-Steuerelement in Schritt 2 erstellt haben, haben Sie das Kontrollkästchen "Verbindungspunkte " 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 Verbindungspunkten in der Datei Polygon.idl die folgende Zeile 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 ClickIn Schnittstelle die ClickOut Methoden und _IPolyCtlEvents 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_IPolyCtlEventsDeklaration 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 Verbindungspunktschnittstellen
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ützen IConnectionPoint, verwenden Sie den Assistenten zum Implementieren von Verbindungspunkten. 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_IPolyCtlEventsKlasse 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 IConnectionPointImplder abgeleitet wird. _IPolyCtlEvents_CP.h definiert nun die beiden Methoden Fire_ClickIn und Fire_ClickOutverwendet 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 "Verbindungspunkte " wurde die Datei _IPolyCtlEvents_CP.h für Sie generiert. Außerdem wurde sie der mehrfachen Vererbungsliste Ihres Steuerelements hinzugefügt CProxy_PolyEventsIConnectionPointContainerImpl 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
CPolyCtlKlasse, und klicken Sie im Kontextmenü auf "Eigenschaften ".Klicken Sie im Eigenschaftenfenster auf das Symbol "Nachrichten " und dann
WM_LBUTTONDOWNin der Liste auf der linken Seite.Klicken Sie in der angezeigten Dropdownliste auf < hinzufügen>". Die
OnLButtonDownHandlerdeklaration 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
OnLButtonDownMethode 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 PtInRegionerkennt.
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