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
Caricare il progetto del controllo.
In Visualizzazione classi fare clic con il pulsante destro del mouse sulla classe di controllo ActiveX per aprire il menu di scelta rapida.
Scegliere Aggiungi dal menu di scelta rapida e quindi fare clic su Aggiungi evento.
Verrà visualizzata l'Aggiunta guidata evento.
Nella casella Nome evento selezionare prima di tutto qualsiasi evento esistente, quindi fare clic sul pulsante di opzione Personalizzato, quindi digitare ClickIn.
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
).Aggiungere un parametro denominato xCoord (tipo OLE_XPOS_PIXELS), usando i controlli Nome parametro e Tipo di parametro.
Aggiungere un secondo parametro denominato yCoord (tipo OLE_YPOS_PIXELS).
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 FireClickIn
inline , 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
Caricare il progetto del controllo.
In Visualizzazione classi selezionare la classe di controllo ActiveX.
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.
Selezionare il messaggio da gestire. Per questo esempio, selezionare
WM_LBUTTONDOWN
.Nella casella di riepilogo a discesa a destra selezionare <Aggiungi> OnLButtonDown.
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'esempio Circ.
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
Caricare il progetto del controllo.
In Visualizzazione classi fare clic con il pulsante destro del mouse sulla classe di controllo ActiveX per aprire il menu di scelta rapida.
Scegliere Aggiungi dal menu di scelta rapida e quindi fare clic su Aggiungi evento.
Verrà visualizzata l'Aggiunta guidata evento.
Nell'elenco a discesa Nome evento selezionare un nome di evento azionario. Per questo esempio, selezionare Fare clic.
Per Tipo di evento selezionare Personalizzato.
Fare clic su Fine per creare l'evento.
Chiamare
FireClick
in posizioni appropriate nel codice.
Vedi anche
Controlli ActiveX MFC
Controlli ActiveX MFC: metodi
Classe COleControl