Share via


Controlli ActiveX MFC: aggiunta di eventi personalizzati

Gli eventi personalizzati differiscono dagli eventi azionari in quanto non vengono generati automaticamente dalla classe COleControl. Un evento personalizzato riconosce una determinata azione, determinata dallo sviluppatore del controllo, come evento. Le voci della mappa eventi per gli eventi personalizzati sono rappresentate dalla macro EVENT_CUSTOM. La sezione seguente implementa un evento personalizzato per un progetto di controllo ActiveX creato tramite la Creazione guidata controllo ActiveX.

Aggiunta di un evento personalizzato con l'Aggiunta guidata evento

La procedura seguente aggiunge un evento personalizzato specifico, ClickIn. È possibile utilizzare questa procedura per aggiungere altri eventi personalizzati. Sostituire il nome dell'evento personalizzato e i relativi parametri per il nome e i parametri dell'evento ClickIn.

Per aggiungere l'evento personalizzato ClickIn tramite l'Aggiunta guidata evento

  1. Caricare il progetto del controllo.

  2. In Visualizzazione classi fare clic con il pulsante destro del mouse sulla classe di controllo ActiveX per aprire il menu di scelta rapida.

  3. Scegliere Aggiungi dal menu di scelta rapida e quindi fare clic su Aggiungi evento.

    Verrà visualizzata l'Aggiunta guidata evento.

  4. Nella casella Nome evento selezionare prima di tutto qualsiasi evento esistente, quindi fare clic sul pulsante di opzione Personalizzato, quindi digitare ClickIn.

  5. Nella casella Nome interno digitare il nome della funzione di attivazione dell'evento. Per questo esempio, usare il valore predefinito fornito dall'Aggiunta guidata evento (FireClickIn).

  6. Aggiungere un parametro denominato xCoord (tipo OLE_XPOS_PIXELS), usando i controlli Nome parametro e Tipo di parametro.

  7. Aggiungere un secondo parametro denominato yCoord (tipo OLE_YPOS_PIXELS).

  8. Fare clic su Fine per creare l'evento.

Aggiungere modifiche alla Creazione guidata eventi per eventi personalizzati

Quando si aggiunge un evento personalizzato, l'Aggiunta guidata eventi apporta modifiche alla classe di controllo . H. CPP e . File IDL. Gli esempi di codice seguenti sono specifici dell'evento ClickIn.

Le righe seguenti vengono aggiunte all'intestazione (. H) file della classe di controllo:

void FireClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord)
{
   FireEvent(eventidClickIn, EVENT_PARAM(VTS_XPOS_PIXELS VTS_YPOS_PIXELS), xCoord, yCoord);
}

Questo codice dichiara una funzione inline denominata FireClickIn che chiama COleControl::FireEvent con l'evento ClickIn e i parametri definiti tramite l'Aggiunta guidata evento.

Inoltre, la riga seguente viene aggiunta alla mappa eventi per il controllo, che si trova nell'implementazione (. File CPP) della classe di controllo:

EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)

Questo codice esegue il mapping dell'evento ClickIn alla funzione FireClickIninline , passando i parametri definiti tramite l'Aggiunta guidata evento.

Infine, la riga seguente viene aggiunta all'oggetto del controllo . File IDL:

[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);

Questa riga assegna all'evento ClickIn un numero ID specifico, ricavato dalla posizione dell'evento nell'elenco eventi Aggiungi creazione guidata eventi. La voce nell'elenco di eventi consente a un contenitore di prevedere l'evento. Ad esempio, potrebbe fornire codice del gestore da eseguire quando viene generato l'evento.

Chiamata a FireClickIn

Ora che è stato aggiunto l'evento personalizzato ClickIn usando l'Aggiunta guidata evento, è necessario decidere quando questo evento deve essere generato. A tale scopo, chiamare FireClickIn quando si verifica l'azione appropriata. Per questa discussione, il controllo usa la InCircle funzione all'interno di un WM_LBUTTONDOWN gestore di messaggi per generare l'evento ClickIn quando un utente fa clic all'interno di un'area circolare o ellittica. La procedura seguente aggiunge il WM_LBUTTONDOWN gestore.

Per aggiungere un gestore di messaggi con l'Aggiunta guidata evento

  1. Caricare il progetto del controllo.

  2. In Visualizzazione classi selezionare la classe di controllo ActiveX.

  3. Nella finestra Proprietà viene visualizzato un elenco di messaggi che possono essere gestiti dal controllo ActiveX. A qualsiasi messaggio visualizzato in grassetto è già assegnata una funzione del gestore.

  4. Selezionare il messaggio da gestire. Per questo esempio, selezionare WM_LBUTTONDOWN.

  5. Nella casella di riepilogo a discesa a destra selezionare <Aggiungi> OnLButtonDown.

  6. Fare doppio clic sulla nuova funzione del gestore in Visualizzazione classi per passare al codice del gestore messaggi nell'implementazione (. File CPP) del controllo ActiveX.

L'esempio di codice seguente chiama la InCircle funzione ogni volta che si fa clic sul pulsante sinistro del mouse all'interno della finestra di controllo. Questo esempio è disponibile nella WM_LBUTTONDOWN funzione del gestore, OnLButtonDown, nell'astrazione dell'esempioCirc.

void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
   if (InCircle(point))
      FireClickIn(point.x, point.y);

   COleControl::OnLButtonDown(nFlags, point);
}

Nota

Quando l'Aggiunta guidata eventi crea gestori di messaggi per le azioni del pulsante del mouse, viene aggiunta automaticamente una chiamata allo stesso gestore messaggi della classe di base. Non rimuovere questa chiamata. Se il controllo utilizza uno dei messaggi del mouse azionario, i gestori di messaggi nella classe base devono essere chiamati per garantire che l'acquisizione del mouse venga gestita correttamente.

Nell'esempio seguente l'evento viene generato solo quando il clic si verifica all'interno di un'area circolare o ellittica all'interno del controllo . Per ottenere questo comportamento, è possibile inserire la InCircle funzione nell'implementazione del controllo (. File CPP):

VARIANT_BOOL CMyAxUICtrl::InCircle(CPoint& point)
{
   CRect rc;
   GetClientRect(rc);
   // Determine radii
   double a = (rc.right - rc.left) / 2;
   double b = (rc.bottom - rc.top) / 2;

   // Determine x, y
   double x = point.x - (rc.left + rc.right) / 2;
   double y = point.y - (rc.top + rc.bottom) / 2;

   // Apply ellipse formula
   return ((x * x) / (a * a) + (y * y) / (b * b) <= 1);
}

Sarà anche necessario aggiungere la dichiarazione seguente della InCircle funzione all'intestazione del controllo (. H) file:

VARIANT_BOOL InCircle(CPoint& point);

Eventi personalizzati con nomi azionari

È possibile creare eventi personalizzati con lo stesso nome degli eventi azionari, ma non è possibile implementare entrambi nello stesso controllo. Ad esempio, potrebbe essere necessario creare un evento personalizzato denominato Click che non viene generato quando l'evento stock Click viene generato normalmente. È quindi possibile attivare l'evento Click in qualsiasi momento chiamando la relativa funzione di attivazione.

La procedura seguente aggiunge un evento Click personalizzato.

Per aggiungere un evento personalizzato che usa un nome di evento azionario

  1. Caricare il progetto del controllo.

  2. In Visualizzazione classi fare clic con il pulsante destro del mouse sulla classe di controllo ActiveX per aprire il menu di scelta rapida.

  3. Scegliere Aggiungi dal menu di scelta rapida e quindi fare clic su Aggiungi evento.

    Verrà visualizzata l'Aggiunta guidata evento.

  4. Nell'elenco a discesa Nome evento selezionare un nome di evento azionario. Per questo esempio, selezionare Fare clic.

  5. Per Tipo di evento selezionare Personalizzato.

  6. Fare clic su Fine per creare l'evento.

  7. Chiamare FireClick in posizioni appropriate nel codice.

Vedi anche

Controlli ActiveX MFC
Controlli ActiveX MFC: metodi
Classe COleControl