Controlli ActiveX MFC: Aggiunta di eventi personalizzati
Gli eventi personalizzati differiscono dagli eventi predefiniti in quanto non vengono automaticamente generati dalla classe COleControl.Un evento personalizzato riconosce determinata azione, determinata dallo sviluppatore del controllo, come evento.Le voci della mappa eventi per gli eventi personalizzati sono rappresentate dalla macro di EVENT_CUSTOM .Nella sezione seguente viene implementato un evento personalizzato per un progetto di controllo ActiveX che è stato creato mediante la Creazione guidata controllo ActiveX.
Aggiunta di un evento personalizzato mediante la creazione guidata di evento aggiungi
La procedura riportata di seguito viene aggiunto un evento personalizzato specifico, ClickIn.È possibile utilizzare questa procedura per aggiungere altri eventi personalizzati.Sostituire il nome di evento personalizzato e i relativi parametri per il nome di evento e i parametri di ClickIn.
Per aggiungere l'evento personalizzato di ClickIn utilizzando la procedura guidata di evento aggiungi
Caricare il progetto del controllo.
In Visualizzazione classi, fare clic con il pulsante destro del mouse sulla classe del controllo ActiveX per aprire il menu di scelta rapida.
Dal menu di scelta rapida, fare clic Aggiungi quindi fare clic su Aggiungi evento.
Verrà avviata la procedura guidata di evento.
Nella casella di Event name , è necessario innanzitutto selezionare qualsiasi evento esistente, quindi fare clic sul pulsante di opzione Personalizzato , il tipo ClickIn.
Nella casella di Internal name , digitare il nome della funzione dell'infornamento dell'evento.Per questo esempio, utilizzare il valore predefinito fornito dalla procedura guidata di evento aggiungi (FireClickIn).
Aggiungere un parametro, denominato xCoord (tipo OLE_XPOS_PIXELS), utilizzando i comandi di Tipo parametro e di Nome parametro .
Aggiungere un secondo parametro, denominato yCoord (tipo OLE_YPOS_PIXELS).
Scegliere Fine per creare l'evento.
Aggiungere le modifiche della procedura guidata degli eventi per gli eventi personalizzati
Quando si aggiunge un evento personalizzato, la procedura guidata di evento aggiungi apportare le modifiche alla classe del controllo. File H, di .CPP e di .IDL.Negli esempi di codice sono specifici all'evento di ClickIn.
Le righe seguenti vengono aggiunti all'intestazione (. H) file della classe del 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 e i parametri di ClickIn è definito utilizzando la procedura guidata di evento.
Inoltre, la riga seguente viene aggiunto alla mappa eventi per il controllo, che si trova nel file di implementazione (.CPP) della classe del controllo:
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
Questo codice consente di associare l'evento ClickIn alla funzione inline FireClickIn, passando consente ai parametri definiti utilizzando la procedura guidata di evento.
Infine, la riga seguente viene aggiunto al file .IDL del controllo:
[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);
Questa riga viene assegnato all'evento di ClickIn un numero ID specifici, ricavato dal percorso dell'evento nell'elenco degli eventi di guidata evento.L'elenco delle voci nel caso consente a un contenitore prevedi l'evento.Ad esempio, potrebbe fornire il codice del gestore da eseguire quando viene generato l'evento.
Chiamare FireClickIn
Dopo aver aggiunto l'evento personalizzato di ClickIn utilizzando la procedura guidata di evento aggiungi, è necessario decidere quando questo evento deve essere generato.A tale scopo FireClickIn quando l'azione appropriata si verifica.Per questa discussione, il controllo utilizza la funzione di InCircle in un gestore messaggi di WM_LBUTTONDOWN per generare l'evento di ClickIn quando un utente in un round robin o un'area ellittica.La procedura riportata di seguito viene aggiunto il gestore di WM_LBUTTONDOWN .
Per aggiungere un gestore messaggi con la procedura guidata di evento aggiungi
Caricare il progetto del controllo.
In Visualizzazione classi, selezionare la classe del controllo ActiveX.
Nella finestra Proprietà fare clic sul pulsante Messaggi.
La Finestra Proprietà viene visualizzato un elenco di messaggi che possono essere gestiti dal controllo ActiveX.Qualsiasi messaggio visualizzato in grassetto dispone già di una funzione di gestione assegnata.
Nella Finestra Proprietà, selezionare il messaggio che si desidera gestire.Per questo esempio, selezionare WM_LBUTTONDOWN.
Nell'elenco a discesa a destra, <Add> OnLButtonDownselezionato.
Fare doppio clic sulla nuova funzione di gestione in Visualizzazione classi per passare al codice del gestore di messaggi nel file di implementazione (.CPP) del controllo ActiveX.
Nell'esempio di codice chiama la funzione di InCircle ogni volta che il pulsante sinistro del mouse viene fatto clic all'interno della finestra di controllo.Questo esempio è disponibile nella funzione di gestione di WM_LBUTTONDOWN , OnLButtonDown, nel sunto di esempio di Circ .
void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
if (InCircle(point))
FireClickIn(point.x, point.y);
COleControl::OnLButtonDown(nFlags, point);
}
[!NOTA]
Quando la procedura guidata di evento aggiungi vengono creati gestori di messaggi per le azioni del pulsante del mouse, una chiamata allo stesso gestore messaggi della classe base viene aggiunta automaticamente.Non rimuovere questa chiamata.Se il controllo utilizza uno dei messaggi predefiniti del mouse, i gestori messaggi nella classe base devono essere chiamati per assicurarsi che lo stato mouse capture viene gestito correttamente.
Nell'esempio seguente, l'evento viene generato solo quando il clic si verifica in un round robin o un'area ellittica all'interno del controllo.A tale scopo, è possibile posizionare la funzione di InCircle nei file dell'implementazione del controllo (.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à inoltre necessario aggiungere la seguente dichiarazione di funzione di InCircle all'intestazione del controllo (. h) file:
VARIANT_BOOL InCircle(CPoint& point);
Eventi personalizzati con i nomi predefiniti
È possibile creare eventi personalizzati con lo stesso nome degli eventi predefiniti, sebbene non è possibile distribuire entrambi nello stesso controllo.Ad esempio, è possibile creare un evento personalizzato denominato clic che non viene generato quando il pulsante predefinito di evento normalmente sarebbe stato generato.È quindi possibile generare l'evento Click in qualsiasi momento chiamando la funzione di infornamento.
La procedura riportata di seguito consente di aggiungere un evento Click personalizzato.
Per aggiungere un evento personalizzato che utilizza un nome di evento predefinito
Caricare il progetto del controllo.
In Visualizzazione classi, fare clic con il pulsante destro del mouse sulla classe del controllo ActiveX per aprire il menu di scelta rapida.
Dal menu di scelta rapida, fare clic Aggiungi quindi fare clic su Aggiungi evento.
Verrà avviata la procedura guidata di evento.
Nell'elenco a discesa di Event Name , selezionare un nome di evento predefinito.Per questo esempio, Clickselezionato.
Per Event Type, Personalizzatoselezionato.
Scegliere Fine per creare l'evento.
Chiamata FireClick alle posizioni appropriate nel codice.