Tipi di Eventi del Grafico
Ci sono 11 tipi di eventi che possono essere elaborati utilizzando la funzione predefinita OnChartEvent(). Per gli eventi personalizzati vengono forniti 65535 identificatori nella gamma di CHARTEVENT_CUSTOM fino a CHARTEVENT_CUSTOM_LAST compreso. Per generare un evento personalizzato, deve essere utilizzata la funzione EventChartCustom().
ENUM_CHART_EVENT
| | |
CHARTEVENT_KEYUP | Rilasciando un tasto |
CHARTEVENT_KEYDOWN | Tasti |
CHARTEVENT_MOUSE_MOVE | Movimento del mouse, clic del mouse (se CHART_EVENT_MOUSE_MOVE=true è impostato per il grafico) |
CHARTEVENT_MOUSE_WHEEL | Pressione o scorrimento della rotellina del mouse (se CHART_EVENT_MOUSE_WHEEL=True per il chart) |
CHARTEVENT_OBJECT_CREATE | Oggetto grafico creato (se CHART_EVENT_OBJECT_CREATE=true è impostato per il chart) |
CHARTEVENT_OBJECT_CHANGE | Oggetto grafico proprietà modificata tramite la finestra delle proprietà |
CHARTEVENT_OBJECT_DELETE | Oggetto grafico eliminato (se CHART_EVENT_OBJECT_DELETE=true è impostato per il chart) |
CHARTEVENT_CLICK | Facendo clic su un chart |
CHARTEVENT_OBJECT_CLICK | Facendo clic su un oggetto grafico |
CHARTEVENT_OBJECT_DRAG | Drag and drop di un oggetto grafico |
CHARTEVENT_OBJECT_ENDEDIT | Fine di modifica del testo nella modifica degli oggetti grafici |
CHARTEVENT_CHART_CHANGE | Modifica della grandezza del grafico o modifica delle proprietà del grafico tramite la finestra delle Proprietà |
CHARTEVENT_CUSTOM | Numero iniziale di un evento da una serie di eventi personalizzati |
CHARTEVENT_CUSTOM_LAST | Il numero finale di un evento di una serie di eventi personalizzati |
evento CHARTEVENT_KEYUP
L'evento CHARTEVENT_KEYUP si verifica quando un utente rilascia un tasto mentre la finestra del grafico ha il focus di input. Questo evento integra l'esistente CHARTEVENT_KEYDOWN, che viene generato quando viene premuto un tasto. L'utilizzo di entrambi gli eventi ci consente di determinare con precisione quando i tasti vengono premuti e rilasciati, il che è utile quando si creano interfacce utente e strumenti con controlli interattivi.
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if(id == CHARTEVENT_KEYUP) { int key = (int)lparam; ::Print("Key released: ", TranslateKey(key)); } } |
lparam contiene (KeyCode) simile all'evento CHARTEVENT_KEYDOWN. Utilizzare la funzione TranslateKey() per ottenere la rappresentazione testuale di un tasto.
Gestione dei tasti morti
È supportata la gestione dei cosiddetti "tasti morti". Si tratta di tasti che non inseriscono immediatamente un carattere, ma modificano l'aspetto del carattere successivo inserito. Ad esempio, nel formato Greco il tasto ; viene utilizzato per porre l'accento sulle vocali (ά, έ, ύ ecc.).
Ora tali tasti possono essere tracciati utilizzando la funzione TranslateKey() nei gestori CHARTEVENT_KEYDOWN e CHARTEVENT_KEYUP. Ciò consente il corretto rilevamento della pressione e del rilascio di combinazioni di tasti complesse in configurazioni multilingue.
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if(id == CHARTEVENT_KEYDOWN) { int key = (int)lparam; string text = TranslateKey(key); ::Print("Pressed: ", text); } if(id == CHARTEVENT_KEYUP) { int key = (int)lparam; string text = TranslateKey(key); ::Print("Released: ", text); } } |
La gestione dei tasti morti è utile quando si implementano campi di testo personalizzati, sistemi di tasti di scelta rapida e interfacce che rispondono a configurazioni di tastiera internazionali.
Input della funzione OnChartEvent
Per ciascun tipo di evento, i parametri di input della funzione OnChartEvent() hanno valori definiti che sono necessari per l'elaborazione di questo evento. Gli eventi ed i valori passati attraverso questi parametri sono elencati nella tabella seguente.
Evento | Valore del parametro id | Valore del parametro lparam | Valore del parametro dparam | Valore del parametro sparam |
Evento di rilascio tasto | CHARTEVENT_KEYUP | Codice tasto rilasciato | Il numero di ripetizioni dell'evento è sempre 1 | Un valore stringa bitmask che descrive lo stato dei tasti modificatori. Vedi Messaggio WM_KEYUP |
Evento di pressione dei tasti | CHARTEVENT_KEYDOWN | Codice del tasto premuto | Numero di ripetizioni dell'evento mentre un tasto rimane premuto | Un valore stringa bitmask che descrive lo stato dei tasti modificatori. Vedi WM_KEYDOWN message |
Eventi del mouse (se CHART_EVENT_MOUSE_MOVE=true è impostato per il grafico) | CHARTEVENT_MOUSE_MOVE | la coordinata X | la coordinata Y | Il valore di stringa di una maschera di bit che descrive lo stato dei pulsanti del mouse |
Evento rotellina del mouse (se CHART_EVENT_MOUSE_WHEEL=true per il chart) | CHARTEVENT_MOUSE_WHEEL | Flag di status di tasti e pulsanti del mouse, le coordinate X e Y del puntatore del mouse. Vedere la descrizione nell' esempio sotto | Il valore Delta della rotellina del mouse | — |
evento di creazione di oggetti grafici (se CHART_EVENT_OBJECT_CREATE=true è impostato per il grafico) | CHARTEVENT_OBJECT_CREATE | — | — | Nome dell'oggetto grafico creato |
Evento di cambiamento di proprietà di un oggetto attraverso la finestra delle proprietà | CHARTEVENT_OBJECT_CHANGE | — | — | Nome dell'oggetto grafico modificato |
Evento di eliminazione oggetto grafico (Se CHART_EVENT_OBJECT_DELETE=true è impostato per il grafico) | CHARTEVENT_OBJECT_DELETE | — | — | Nome dell'oggetto grafico eliminato |
Evento di un click del mouse sul chart | CHARTEVENT_CLICK | la coordinata X | la coordinata Y | — |
Evento di un clic del mouse in un oggetto grafico appartenente alla tabella | CHARTEVENT_OBJECT_CLICK | la coordinata X | la coordinata Y | Nome dell'oggetto grafico, in cui l'evento si è verificato |
Evento di trascinamento di un oggetto grafico con il mouse | CHARTEVENT_OBJECT_DRAG | — | — | Nome dell'oggetto grafico spostato |
Evento di fine modifica del testo nella casella di immissione dell'oggetto grafico LabelEdit | CHARTEVENT_OBJECT_ENDEDIT | — | — | Nome dell' oggetto grafico LabelEdit, in cui la modifica del testo è stata completata |
Evento di cambiamento della grandezza del chart o modifica delle proprietà del chart tramite la finestra delle Proprietà | CHARTEVENT_CHART_CHANGE | — | — | — |
ID dell'evento dell'utente con il numero N | CHARTEVENT_CUSTOM+N | Valore impostato dalla funzione EventChartCustom() | Valore impostato dalla funzione EventChartCustom() | Valore impostato dalla funzione EventChartCustom() |
Esempio:
#define KEY_NUMPAD_5 12 #define KEY_LEFT 37 #define KEY_UP 38 #define KEY_RIGHT 39 #define KEY_DOWN 40 #define KEY_NUMLOCK_DOWN 98 #define KEY_NUMLOCK_LEFT 100 #define KEY_NUMLOCK_5 101 #define KEY_NUMLOCK_RIGHT 102 #define KEY_NUMLOCK_UP 104 //+--------------------------------------------------------------------------------+ //| Funzione di inizializzazione dell' Expert | //+--------------------------------------------------------------------------------+ int OnInit() { //--- Print("L'expert con nome ",MQL5InfoString(MQL5_PROGRAM_NAME)," sta girando"); //--- abilita gli eventi di creazione degli oggetti ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true); //--- abilita gli eventi di eliminazione degli oggetti ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true); //--- l'aggiornamento forzato delle proprietà del chart garantisce la preparazione per l'elaborazione degli eventi ChartRedraw(); //--- return(INIT_SUCCEEDED); } //+--------------------------------------------------------------------------------+ //| ChartEvent function | //+--------------------------------------------------------------------------------+ void OnChartEvent(const int id, // Identificatore eventi const long& lparam, // Parametro evento di tipo long const double& dparam, // Parametro evento di tipo double const string& sparam // Parametro evento di tipo stringa ) { //--- il bottone sinistro del mouse è stato premuto sul chart if(id==CHARTEVENT_CLICK) { Print("Le coordinate del click del mouse sul chart sono: x = ",lparam," y = ",dparam); } //--- il mouse è stato cliccatto sull'oggetto grafico if(id==CHARTEVENT_OBJECT_CLICK) { Print("Il mouse è stato cliccato sull'oggetto con nome'"+sparam+"'"); } //--- il tasto è stato premuto if(id==CHARTEVENT_KEYDOWN) { switch(lparam) { case KEY_NUMLOCK_LEFT: Print("E' stato premuto KEY_NUMLOCK_LEFT"); break; case KEY_LEFT: Print("E' stato premuto KEY_LEFT"); break; case KEY_NUMLOCK_UP: Print("E' stato premuto KEY_NUMLOCK_UP"); break; case KEY_UP: Print("E' stato premuto il tasto KEY_UP"); break; case KEY_NUMLOCK_RIGHT: Print("E' stato premuto il tasto KEY_NUMLOCK_RIGHT"); break; case KEY_RIGHT: Print("E' stato premuto il tasto KEY_RIGHT"); break; case KEY_NUMLOCK_DOWN: Print("E' stato premuto il tasto KEY_NUMLOCK_DOWN"); break; case KEY_DOWN: Print("E' stato premuto il tasto KEY_DOWN"); break; case KEY_NUMPAD_5: Print("E' stato premuto il tasto KEY_NUMPAD_5"); break; case KEY_NUMLOCK_5: Print("E' stato premuto il tasto KEY_NUMLOCK_5 "); break; default: Print("Alcuni tasti non elencati sono stati premuti"); } ChartRedraw(); } //--- l'oggetto è stato eliminato if(id==CHARTEVENT_OBJECT_DELETE) { Print("L'oggetto con nome ",sparam," è stato premuto"); } //--- L'oggetto è stato creato if(id==CHARTEVENT_OBJECT_CREATE) { Print("L'oggetto con nome ",sparam," è stato creato"); } //--- l'oggetto è stato mosso o le sue coordinate dei punti di ancoraggio sono state cambiate if(id==CHARTEVENT_OBJECT_DRAG) { Print("Le coordinate dei punti di ancoraggio dell'oggetto con nome ",sparam," sono state cambiate"); } //--- il testo nell'Edit dell'oggetto è stato cambiato if(id==CHARTEVENT_OBJECT_ENDEDIT) { Print("Il testo nel campo Edit dell'oggetto con nome ",sparam," è stato cambiato"); } } |
Per l'evento CHARTEVENT_MOUSE_MOVE il parametro stringa @param contiene informazioni sullo stato della tastiera e dei pulsanti del mouse:
| | |
1 | Stato del tasto sinistro del mouse |
2 | Stato del tasto destro del mouse |
3 | Stato del pulsante SHIFT |
4 | Stato del pulsante CTRL |
5 | Stato del pulsante centrale del mouse |
6 | Stato del primo pulsante del mouse in più |
7 | Stato del secondo tasto del mouse in più |
Esempio:
//+------------------------------------------------------------------+ //| Funzione di inizializzazione Expert | //+------------------------------------------------------------------+ void OnInit() { //--- abilita messaggi CHART_EVENT_MOUSE_MOVE ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1); // --- disabilita il menu contestuale del grafico (a destra) ChartSetInteger(0,CHART_CONTEXT_MENU,0); // --- disabilita il mirino (tramite il pulsante centrale) ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0); //--- l'aggiornamento forzato delle proprietà del chart garantisce la preparazione per l'elaborazione degli eventi ChartRedraw(); } //+------------------------------------------------------------------+ //| MouseState | //+------------------------------------------------------------------+ string MouseState(uint state) { string res; res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse sinistra res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse destra res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse centro res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // mouse primo tasto X res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // mouse secondo tasto X res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // tasto shift res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // tasto control return(res); } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { if(id==CHARTEVENT_MOUSE_MOVE) Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam)); } |
Per l'evento CHARTEVENT_MOUSE_WHEEL, i parametri lParam e dparam contengono informazioni sugli stati dei tasti Ctrl e Shift, dei pulsanti del mouse, delle coordinate del cursore e del valore di scorrimento della rotellina del mouse. Per una migliore comprensione, esegui questo Expert Advisor su un chart e scorri la rotellina del mouse, mentre premi diversi bottoni e tieni premuti i tasti descritti nel codice.
Esempio diCHARTEVENT_MOUSE_WHEEL event processing:
//+------------------------------------------------------------------+ //| Funzione di inizializzazione Expert | //+------------------------------------------------------------------+ void OnInit() { //--- Abilitazione dei messaggi di scorrimento della rotellina del mouse ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1); //--- L'aggiornamento forzato delle proprietà del chart garantisce la preparazione per l'elaborazione degli eventi ChartRedraw(); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { if(id==CHARTEVENT_MOUSE_WHEEL) { //--- Considera lo stato dei pulsanti e della rotella del mouse per questo evento int flg_keys = (int)(lparam>>32); // La flag degli stati dei tasti Ctrl e Shift e dei pulsanti del mouse int x_cursor = (int)(short)lparam; // la coordinata X dove si è verificato l'evento della rotella del mouse int y_cursor = (int)(short)(lparam>>16); // la coordinata Y dove si è verificato l'evento del mouse int delta = (int)dparam; // il valore totale dello scroll del mouse, si innesca quando viene raggiunto +120 o -120 //--- Elaborazione della flag string str_keys=""; if((flg_keys&0x0001)!=0) str_keys+="LMOUSE "; if((flg_keys&0x0002)!=0) str_keys+="RMOUSE "; if((flg_keys&0x0004)!=0) str_keys+="SHIFT "; if((flg_keys&0x0008)!=0) str_keys+="CTRL "; if((flg_keys&0x0010)!=0) str_keys+="MMOUSE "; if((flg_keys&0x0020)!=0) str_keys+="X1MOUSE "; if((flg_keys&0x0040)!=0) str_keys+="X2MOUSE "; if(str_keys!="") str_keys=", keys='"+StringSubstr(str_keys,0,StringLen(str_keys)-1) + "'"; PrintFormat("%s: X=%d, Y=%d, delta=%d%s",EnumToString(CHARTEVENT_MOUSE_WHEEL),x_cursor,y_cursor,delta,str_keys); } } //+------------------------------------------------------------------+ /* Esempio di output CHARTEVENT_MOUSE_WHEEL: Ctrl pressed: X=193, Y=445, delta=-120 CHARTEVENT_MOUSE_WHEEL: Shift pressed: X=186, Y=446, delta=120 CHARTEVENT_MOUSE_WHEEL: X=178, Y=447, delta=-120 CHARTEVENT_MOUSE_WHEEL: X=231, Y=449, delta=120 CHARTEVENT_MOUSE_WHEEL: MiddleButton pressed: X=231, Y=449, delta=120 CHARTEVENT_MOUSE_WHEEL: LeftButton pressed: X=279, Y=320, delta=-120 CHARTEVENT_MOUSE_WHEEL: RightButton pressed: X=253, Y=330, delta=120 */ |
Vedi anche
Funzioni Event Handling, Operazioni con gli eventi