Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In deze stap voegt u een ClickIn en een ClickOut gebeurtenis toe aan uw ATL-besturingselement. U zult de ClickIn gebeurtenis activeren als de gebruiker binnen de veelhoek klikt en de ClickOut gebeurtenis activeren als de gebruiker daarbuiten klikt. De taken voor het toevoegen van een gebeurtenis zijn als volgt:
De methoden
ClickInenClickOuttoevoegenDe typebibliotheek genereren
De verbindingspuntinterfaces implementeren
De ClickIn- en ClickOut-methoden toevoegen
Toen u het ATL-besturingselement in stap 2 hebt gemaakt, hebt u het selectievakje Verbindingspunten ingeschakeld. Hiermee is de _IPolyCtlEvents interface in het bestand Polygon.idl gemaakt. Houd er rekening mee dat de interfacenaam begint met een onderstrepingsteken. Dit is een conventie om aan te geven dat de interface een interne interface is. Programma's waarmee u door COM-objecten kunt bladeren, kunnen er dus voor kiezen om de interface niet weer te geven aan de gebruiker. Houd er ook rekening mee dat het selecteren van verbindingspunten de volgende regel in het bestand Polygon.idl heeft toegevoegd om aan te geven dat _IPolyCtlEvents dit de standaardbroninterface is:
[default, source] dispinterface _IPolyCtlEvents;
Het bronkenmerk geeft aan dat het besturingselement de bron van de meldingen is, zodat deze interface in de container wordt aangeroepen.
Voeg nu de ClickIn en ClickOut methoden toe aan de _IPolyCtlEvents interface.
De ClickIn- en ClickOut-methoden toevoegen
Open Polygon.idl in Solution Explorer en voeg de volgende code toe onder
methods:in dedispInterface_IPolyCtlEventsdeclaratie van de PolygonLib-bibliotheek.[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);
De ClickIn en ClickOut methoden nemen de x- en y-coördinaten van het klikpunt als parameters.
De typebibliotheek genereren
Genereer de typebibliotheek op dit moment, omdat het project deze gebruikt om de informatie te verkrijgen die nodig is om een verbindingspuntinterface en een containerinterface voor het verbindingspunt voor uw besturingselement te maken.
Om de typebibliotheek te genereren
Bouw uw project opnieuw.
– of –
Klik met de rechtermuisknop op het bestand Polygon.idl in Solution Explorer en klik op Compileren in het snelmenu.
Hiermee maakt u het polygon.tlb-bestand. Dit is uw typebibliotheek. Het polygon.tlb-bestand is niet zichtbaar in Solution Explorer, omdat het een binair bestand is en niet rechtstreeks kan worden bekeken of bewerkt.
De verbindingspuntinterfaces implementeren
Implementeer een verbindingspuntinterface en een verbindingspuntcontainerinterface voor uw besturingselement. In COM worden gebeurtenissen geïmplementeerd via het mechanisme van verbindingspunten. Als u gebeurtenissen van een COM-object wilt ontvangen, brengt een container een adviesverbinding tot stand met het verbindingspunt dat door het COM-object wordt geïmplementeerd. Omdat een COM-object meerdere verbindingspunten kan hebben, implementeert het COM-object ook een containerinterface voor verbindingspunten. Via deze interface kan de container bepalen welke verbindingspunten worden ondersteund.
De interface die een verbindingspunt implementeert, wordt aangeroepen IConnectionPointen de interface waarmee een verbindingspuntcontainer wordt geïmplementeerd, wordt aangeroepen IConnectionPointContainer.
Voor hulp bij het implementeren IConnectionPointgebruikt u de wizard Verbindingspunt implementeren. Deze wizard genereert de IConnectionPoint interface door uw typebibliotheek te lezen en een functie te implementeren voor elke gebeurtenis die kan worden geactiveerd.
De verbindingspunten implementeren
Open in Solution Explorer _IPolyCtlEvents_CP.h en voeg de volgende code toe onder de
public:instructie in deCProxy_IPolyCtlEventsklasse: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; }
U ziet dat dit bestand een klasse CProxy_IPolyCtlEvents heeft die is afgeleid van IConnectionPointImpl. _IPolyCtlEvents_CP.h definieert nu de twee methoden Fire_ClickIn en Fire_ClickOut, die de twee coördinatenparameters nemen. U roept deze methoden aan wanneer u een gebeurtenis vanuit uw controle wilt uitvoeren.
Door het besturingselement met de optie Verbindingspunten te selecteren, is het bestand _IPolyCtlEvents_CP.h voor u gegenereerd. Het heeft ook CProxy_PolyEvents en IConnectionPointContainerImpl toegevoegd aan de multiple inheritance-lijst van uw besturingselement en IConnectionPointContainer voor u zichtbaar gemaakt door de juiste vermeldingen toe te voegen aan de COM-kaart.
U bent klaar met het implementeren van de code ter ondersteuning van gebeurtenissen. Voeg nu code toe om de gebeurtenissen op het juiste moment te activeren. Vergeet niet dat je een ClickIn of ClickOut gebeurtenis gaat activeren wanneer de gebruiker op de linkermuisknop in de besturing klikt. Als u wilt achterhalen wanneer de gebruiker op de knop klikt, voegt u een handler voor het WM_LBUTTONDOWN bericht toe.
Een handler toevoegen voor het WM_LBUTTONDOWN-bericht
Klik in klasseweergave met de rechtermuisknop op de
CPolyCtlklasse en klik op Eigenschappen in het snelmenu.Klik in het venster Eigenschappen op het pictogram Berichten en klik
WM_LBUTTONDOWNvervolgens in de lijst aan de linkerkant.Klik in de vervolgkeuzelijst die wordt weergegeven op <Add> OnLButtonDown. De
OnLButtonDownhandlerdeclaratie wordt toegevoegd aan PolyCtl.h en de handler-implementatie wordt toegevoegd aan PolyCtl.cpp.
Wijzig vervolgens de handler.
De methode OnLButtonDown wijzigen
Wijzig de code die bestaat uit de
OnLButtonDownmethode in PolyCtl.cpp (door de wizard geplaatste code verwijderen), zodat deze er als volgt uitziet: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; }
Deze code maakt gebruik van de punten die in de OnDraw functie worden berekend om een regio te maken waarmee de muisklikken van de gebruiker worden gedetecteerd met de aanroep naar PtInRegion.
De parameter uMsg is de id van het Windows-bericht dat wordt verwerkt. Hiermee kunt u één functie hebben waarmee een bereik van berichten wordt verwerkt. De parameters wParam en lParam zijn de standaardwaarden voor het bericht dat wordt verwerkt. Met de parameter bHandled kunt u opgeven of de functie het bericht heeft verwerkt of niet. De waarde is standaard ingesteld op TRUE om aan te geven dat de functie het bericht heeft verwerkt, maar u kunt deze instellen op ONWAAR. Hierdoor blijft ATL op zoek naar een andere berichtenhandlerfunctie om het bericht naar te verzenden.
Het besturingselement bouwen en testen
Probeer nu je evenementen uit. Bouw het besturingselement en start de ActiveX-besturingselementtestcontainer opnieuw. Bekijk dit keer het venster van het gebeurtenislogboek. Als u gebeurtenissen naar het uitvoervenster wilt routeren, klikt u op Logboekregistratie in het menu Opties en selecteert u Logboek naar uitvoervenster. Voeg het besturingselement in en probeer te klikken in het venster. Houd er rekening mee dat ClickIn wordt geactiveerd als u binnen de gevulde veelhoek klikt en ClickOut wordt geactiveerd wanneer u erbuiten klikt.
Vervolgens voegt u een eigenschappenpagina toe.
Terug naar stap 4 | Aan stap 6