Freigeben über


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 Und ClickOut Methoden

  • Generieren 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

  1. Öffnen Sie in Projektmappen-Explorer Polygon.idl, und fügen Sie den folgenden Code in methods: der dispInterface_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

  1. Erstellen Sie das Projekt neu.

    Oder

  2. 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

  1. Ö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 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 Verbinden ionspunkte 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

  1. Klicken Sie in der Klassenansicht mit der rechten Maustaste auf die CPolyCtl Klasse, und klicken Sie im Kontextmenü auf "Eigenschaften ".

  2. Klicken Sie im Eigenschaftenfenster auf das Symbol "Nachrichten " und dann WM_LBUTTONDOWN in der Liste auf der linken Seite.

  3. 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

  1. Ä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 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

Siehe auch

Tutorial