Passaggio 5: Aggiunta di un evento

Ora aggiungerà un ClickIn e un ClickOut evento al controllo ATL. Verrà generato il ClickIn evento se l'utente fa clic all'interno del poligono e fuoco ClickOut se l'utente fa clic all'esterno.

Qua&ndo il controllo completo è stata creata nel passaggio 2, selezionato il Supporto di punti di connessione controllo box.nbsp; Questo ha creato il IPolyCtlEvents interfaccia nel file IDL.  Si noti che il nome dell'interfaccia inizia con un carattere di sottolineatura. Questa è una convenzione per indicare che l'interfaccia è un'interfaccia interna. Così, programmi che consentono di individuare oggetti COM possono scegliere di non visualizzare l'interfaccia per l'utente. Anche avviso nel file IDL che I punti di connessione supporto aggiunto una riga per indicare che IPolyCtlEvents è l'interfaccia di origine predefinito. L'attributo di origine indica che il controllo è la fonte delle notifiche, così chiamerà questa interfaccia sul contenitore.

Ora si dovrebbero aggiungere i metodi ClickIn e ClickOut per la IPolyCtlEvents interfaccia:

  1. Fare clic con il pulsante destro su IPolyCtlEvents in ClassView e selezionando Aggiungi metodo dal menu a comparsa.

  2. Selezionare un tipo restituito divoid.

  3. Tipo ClickIn nella casella Nome metodo..

  4. Digitare [in] long x, [in] long y nella casella parametri.

  5. Fare clic su OK.

Co&ntrollare il file IDL per verificare che il codice è stato aggiunto come un metodo per la IPolyCtlEvents dispinterface.nbsp; Quindi utilizzare la stessa procedura per definire un ClickOut Metodo con gli stessi parametri e il tipo restituito.  L'interfaccia dispatch IPolyCtlEvents nel file IDL ora dovrebbe essere simile a questo:

interfaccia dispatch  IPolyCtlEvents
{
   Proprietà:
   Metodi:
   [id(1), helpstring ("metodo ClickIn")] public static void ClickIn ([in] long x, [in] long y);
   [id(2), helpstring ("metodo ClickOut")] public static void ClickOut ([in] long x, [in] long y);
}

Il ClickIn e ClickOut i metodi che accettano gli assi x e y coordinate del punto cliccato come parametri.

Ora generare la libreria dei tipi. Per fare questo si può rigenerare il progetto o fare clic destro file idl in FileVisualizza e fare clic su Polygon compilare. Questo creerà il file Polygon.tlb, che è la tua libreria dei tipi.

Successivamente, implementare un'interfaccia del punto di connessione e un'interfaccia del contenitore del punto di connessione per il controllo. (In COM, gli eventi vengono implementati attraverso il meccanismo dei punti di connessione. Per ricevere gli eventi da un oggetto COM, un contenitore stabilisce una connessione consultiva per il punto di connessione che implementa l'oggetto COM. Poiché un oggetto COM può avere molteplici punti di connessione, l'oggetto COM implementa anche un'interfaccia contenitore del punto di connessione. Attraverso questa interfaccia, il contenitore può determinare quali punti di connessione sono supportati.) L'interfaccia che implementa un punto di connessione viene chiamato IConnectionPoint e l'interfaccia che implementa un contenitore di punto di connessione è denominata IConnectionPointContainer.

Per aiutare ad attuare IConnectionPoint, utilizzare ClassView per accedere a guidata punto di connessione. Questa procedura guidata genera l'interfaccia IConnectionPoint leggendo la tua libreria dei tipi e implementando una funzione per ogni evento che può essere licenziato.

Per eseguire la procedura guidata, attenersi alla seguente procedura:

  1. Vai a ClassView (menu Visualizza , fare clic su area di lavoro per vedere ClassView).

  2. Fare clic con il pulsante destro sulla classe di implementazione del controllo, in questo caso CPolyCtl.

  3. Nel menu di scelta rapida, selezionare Implementare connessione Point….

  4. Selezionare _PolyEvents dal elenco di interfacce quindi fare clic su OK e una classe proxy per il punto di connessione verrà generati, in questo caso, CProxy_IPolyCtlEvents.

Se si esamina il file generato PolygonCP. H in FileVisualizza, si vede che ha una classe denominata CProxy_PolyCtlEvents che deriva da IConnectionPointImpl. PolygonCP. H definisce anche i due metodi Fire_ClickIn e Fire_ClickOut , che prendono i due parametri delle coordinate. Questi sono i metodi che chiamano quando si desidera generare un evento dal vostro controllo.

La procedura guidata a&nche aggiunto il CProxy_PolyEvents e IConnectionPointContainerImpl al più list.nbsp di ereditarietà del controllo; La procedura guidata anche esposti IConnectionPointContainer per voi con l'aggiunta di voci appropriate per la mappa COM.

Siete finiti implementare il codice per supportare gli eventi. Ora, aggiungere codice per gli eventi del fuoco al momento opportuno. Ricordate, avete intenzione di sparare un ClickIn o ClickOut evento quando l'utente fa clic sul pulsante sinistro del mouse nel controllo. Per sapere quando l'utente fa clic sul pulsante, prima di aggiungere un gestore per il messaggio WM_LBUTTO&NDOWN . In ClassView, fare clic con il pulsante destro sulla classe CPolyCtl e selezionare Aggiungi Windows gestore messaggi... da menu.nbsp la scelta rapida; Quindi selezionare WM_LBUTTONDOWN dall'elenco a sinistra e fare clic sul pulsante Aggiungi gestore .  Fare clic su OK.

Successivamente, aggiungere il nuovo codice per la funzione di OnLButtonDown in PolyCtl. H (eliminazione di qualsiasi codice inserito nella procedura guidata) affinché OnLButtonDown ora assomiglia a questo:

LRESULT CPolyCtl::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOLamp; bHandled)
{
   HRGN hRgn;
   PAROLA xPos = LOWORD(lParam);  / / orizzontale posizione del cursore
   PAROLA yPos = HIWORD(lParam);  / / verticale posizione del cursore

CalcPoints(m_rcPos);

/ / Crea una regione dalla nostra lista di punti
   hRgn = CreatePolygonRgn (& m_arrPoint [0], m_nSides, avvolgimento);

/ / Se il punto selezionato è in nostro poligono poi fuoco il ClickIn
   / / evento altrimenti ci fire l'evento ClickOut
   Se (PtInRegion (hRgn, xPos, Posy))
      Fire_ClickIn (posx, Posy);
   altro
      Fire_ClickOut (posx, Posy);

/ / Eliminare la regione che abbiamo creato
   DeleteObject(hRgn);
   return 0;
}

Dal momento che già si sono calcolati i punti del poligono nella OnDraw function, usarli in OnLButtonDown per creare una regione. Quindi, utilizzare la funzione PtInRegion API per determinare se il punto selezionato è all'interno del poligono o no.

Il uMsg parametro è l'ID del messaggio Windows viene gestito. Questo consente di avere una funzione che gestisce una serie di messaggi. Il wParam e il lParam sono i valori standard per il messaggio viene gestita. Il parametro bHandled consente di specificare se la funzione gestita il messaggio o no. Per impostazione predefinita, il valore è impostato su TRUE per indicare che la funzione gestite il messaggio, ma è possibile impostare su falsa. In questo modo causerà ATL continuare alla ricerca di un'altra funzione di gestore del messaggio a cui inviare il messaggio.

Ora provare i vostri eve&nti. Compilare il controllo e ricominciare ActiveX Control Test Container . Questa volta, visualizzare il registro eventi window.nbsp; Per indirizzare gli eventi nella finestra di output, selezionare registrazione dal menu opzioni e selezionare registra finestra di output. Ora inserire il controllo e prova clic nell'area. Si noti che ClickIn viene generato se si fa clic all'interno del poligono pieno e ClickOut viene generato quando si fa clic di fuori di esso.

Successivamente si aggiungerà una pagina delle proprietà.

Torna a passo 4 |nbsp; Al passaggio 6

Index