Types des Evènements Graphiques
11 types d'évènements peuvent être traités avec la fonction prédéfinie OnChartEvent(). Pour des évènements personnalisés, 65535 identificateurs sont fournis dans l'intervalle CHARTEVENT_CUSTOM à CHARTEVENT_CUSTOM_LAST inclusive. Pour générer un évènement personnalisé, il faut appeler la fonction EventChartCustom().
ENUM_CHART_EVENT
|
|
|
CHARTEVENT_KEYUP
|
Relâchement d'une touche
|
CHARTEVENT_KEYDOWN
|
Touches
|
CHARTEVENT_MOUSE_MOVE
|
Mouvement et clics de la souris (si CHART_EVENT_MOUSE_MOVE=true est défini pour le graphique)
|
CHARTEVENT_MOUSE_WHEEL
|
Pressing or scrolling the mouse wheel (if CHART_EVENT_MOUSE_WHEEL=True for the chart)
|
CHARTEVENT_OBJECT_CREATE
|
Objet graphique créé (si CHART_EVENT_OBJECT_CREATE=true est défini pour le graphique)
|
CHARTEVENT_OBJECT_CHANGE
|
Changement d'une propriété d'un objet graphique via la boîte de dialogue des propriétés
|
CHARTEVENT_OBJECT_DELETE
|
Objet graphique effacé (si CHART_EVENT_OBJECT_DELETE=true est défini pour le graphique)
|
CHARTEVENT_CLICK
|
Clic sur un graphique
|
CHARTEVENT_OBJECT_CLICK
|
Clic sur un objet graphique
|
CHARTEVENT_OBJECT_DRAG
|
Drag and drop d'un objet graphique
|
CHARTEVENT_OBJECT_ENDEDIT
|
Fin d'édition du texte dans l'objet graphique Champ d'Edition
|
CHARTEVENT_CHART_CHANGE
|
Changement de la taille du graphique ou modification des propriétés du graphique via la boîte de dialogue des propriétés
|
CHARTEVENT_CUSTOM
|
Numéro initial d'un évènement dans l'intervalle des évènements personnalisés
|
CHARTEVENT_CUSTOM_LAST
|
Le numéro final d'un évènement dans l'intervalle des évènements personnalisés
|
Evènement CHARTEVENT_KEYUP
L'évènement CHARTEVENT_KEYUP se produit lorsqu'un utilisateur relâche une touche du clavier alors que le focus est placé sur la fenêtre du graphique. Cet évènement complète l'évènement CHARTEVENT_KEYDOWN existant, qui est généré lorsqu'une touche du clavier est enfoncée. L'utilisation des deux événements nous permet de déterminer avec précision quand les touches sont enfoncées et relâchées, ce qui est utile lors de la création d'interfaces utilisateur et d'outils avec des contrôles interactifs..
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 contient le code la touche (KeyCode), similaire à l'évènement CHARTEVENT_KEYDOWN. Utiliser la fonction TranslateKey() pour obtenir la représentation textuelle de la touche.
Gestion des touches mortes
La gestion des touches dites "mortes" est supportée. Ce sont des touches qui ne permettent pas de saisir immédiatement un caractère, mais qui modifient l'apparence du prochain caractère saisi. Par exemple, en grec, la touche ; est utilisée pour mettre un accent sur les voyelles (ά, έ, ύ, etc.).
Ces touches peuvent maintenant être suivies avec la fonction TranslateKey() dans les fonctions CHARTEVENT_KEYDOWN et CHARTEVENT_KEYUP. Cela permet une détection correcte de la pression et du relâchement de combinaisons de touches complexes dans les configurations multilingues.
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 gestion des touches mortes est utile lors de l'implémentation de champs de texte personnalisés, de systèmes de raccourcis clavier et d'interfaces qui répondent aux dispositions de clavier internationales..
Entrées de la fonction OnChartEvent
Pour chaque type d'évènement, les paramètres d'entrée de la fonction OnChartEvent() ont des valeurs définies requises pour le traitement de cet évènement. Les évènements et les valeurs passés via ces paramètres sont listés dans le tableau ci-dessous.
Evènement
|
Valeur du paramètre id
|
Valeur du paramètre lparam
|
Valeur du paramètre dparam
|
Valeur du paramètre sparam
|
Événement de libération d'une touche
|
CHARTEVENT_KEYUP
|
Code de la touche relâchée
|
Le nombre de répétitions d'événements est toujours de 1
|
Une valeur de textuelle du masque de bits décrivant l'état des touches de modification.. Voir le message WM_KEYUP
|
Evènement d'appui sur une touche
|
CHARTEVENT_KEYDOWN
|
Code de la touche enfoncée
|
Le nombre de répétitions de l'événement tant que la touche reste enfoncée
|
Une valeur de textuelle du masque de bits décrivant l'état des touches de modification.. Voir le WM_KEYDOWN message
|
Evènements souris (si CHART_EVENT_MOUSE_MOVE=true est défini pour le graphique)
|
CHARTEVENT_MOUSE_MOVE
|
la coordonnée X
|
la coordonnée Y
|
La valeur de type string du masque de bits décrivant le statut des boutons de la souris
|
Mouse wheel event (if CHART_EVENT_MOUSE_WHEEL=true for the chart)
|
CHARTEVENT_MOUSE_WHEEL
|
Flags of states of keys and mouse buttons, the X and Y coordinates of the mouse pointer. See description in the example below
|
The Delta value of the mouse wheel scroll
|
|
Evènement de création d'un objet graphique (si CHART_EVENT_OBJECT_CREATE=true est défini pour le graphique)
|
CHARTEVENT_OBJECT_CREATE
|
|
|
Nom de l'objet graphique créé
|
Evènement de changement de propriété d'un objet via la boîte de dialogue des propriétés
|
CHARTEVENT_OBJECT_CHANGE
|
|
|
nom de l'objet graphique modifié
|
Evènement de suppression d'un objet graphique (si CHART_EVENT_OBJECT_DELETE=true est défini pour le graphique)
|
CHARTEVENT_OBJECT_DELETE
|
|
|
Nom de l'objet graphique supprimé
|
Evènement de clic de la souris sur le graphique
|
CHARTEVENT_CLICK
|
la coordonnée X
|
la coordonnée Y
|
|
Evènement de clic de la souris sur un objet graphique appartenant au graphique
|
CHARTEVENT_OBJECT_CLICK
|
la coordonnée X
|
la coordonnée Y
|
Nom de l'objet graphique sur lequel l'évènement s'est produit
|
Evènement de déplacement d'un objet graphique avec la souris
|
CHARTEVENT_OBJECT_DRAG
|
|
|
Nom de l'objet graphique déplacé
|
Evènement de fin d'édition du texte dans la zone de saisie d'un objet graphique Champ d'Edition
|
CHARTEVENT_OBJECT_ENDEDIT
|
|
|
Nom de l'objet graphique Champ d'Edition dans lequel l'édition du texte est terminée
|
Evènement de changement de la taille du graphique ou modification des propriétés du graphique via la boîte de dialogue des Propriétés
|
CHARTEVENT_CHART_CHANGE
|
|
|
|
Identificateur de l'évènement utilisateur sous le numéro N
|
CHARTEVENT_CUSTOM+N
|
Valeur définie par la fonction EventChartCustom()
|
Valeur définie par la fonction EventChartCustom()
|
Valeur définie par la fonction EventChartCustom()
|
Exemple :
#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
//+----------------------------------------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert |
//+----------------------------------------------------------------------------------------------------+
int OnInit()
{
//---
Print("L'expert avec le nom ",MQL5InfoString(MQL5_PROGRAM_NAME)," est en cours d'exécution");
//--- active les évènements de création d'objet
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- active les évènements de suppression d'objet
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- la mise à jour forcée des propriétés du graphique assure qu'elles seront prises en compte pour gérer les évènements
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+----------------------------------------------------------------------------------------------------+
//| Fonction ChartEvent |
//+----------------------------------------------------------------------------------------------------+
void OnChartEvent(const int id, // Identificateur de l'évènement
const long& lparam, // Paramètre de l'évènement de type long
const double& dparam, // Paramètre de l'évènement de type double
const string& sparam // Paramètre de l'évènement de type string
)
{
//--- le bouton gauche de la souris a été appuyé sur le graphique
if(id==CHARTEVENT_CLICK)
{
Print("Les coordonnées du clic de la souris sur le graphique sont : x = ",lparam," y = ",dparam);
}
//--- le clic de souris a eu lieu sur l'objet graphique
if(id==CHARTEVENT_OBJECT_CLICK)
{
Print("Le clic de souris a eu lieu sur l'objet nommé '"+sparam+"'");
}
//--- la touche a été pressée
if(id==CHARTEVENT_KEYDOWN)
{
switch(lparam)
{
case KEY_NUMLOCK_LEFT: Print("La touche KEY_NUMLOCK_LEFT a été pressée"); break;
case KEY_LEFT: Print("La touche KEY_LEFT a été pressée"); break;
case KEY_NUMLOCK_UP: Print("La touche KEY_NUMLOCK_UP a été pressée"); break;
case KEY_UP: Print("La touche KEY_UP a été pressée"); break;
case KEY_NUMLOCK_RIGHT: Print("La touche KEY_NUMLOCK_RIGHT a été pressée"); break;
case KEY_RIGHT: Print("la touche KEY_RIGHT a été pressée"); break;
case KEY_NUMLOCK_DOWN: Print("La touche KEY_NUMLOCK_DOWN a été pressée"); break;
case KEY_DOWN: Print("La touche KEY_DOWN a été pressée"); break;
case KEY_NUMPAD_5: Print("La touche KEY_NUMPAD_5 a été pressée"); break;
case KEY_NUMLOCK_5: Print("La touche KEY_NUMLOCK_5 a été pressée"); break;
default: Print("Une touche non listée a été pressée");
}
ChartRedraw();
}
//--- l'objet a été supprimé
if(id==CHARTEVENT_OBJECT_DELETE)
{
Print("L'objet avec le nom ",sparam," a été supprimé");
}
//--- l'objet a été créé
if(id==CHARTEVENT_OBJECT_CREATE)
{
Print("L'objet avec le nom ",sparam," a été créé");
}
//--- l'objet a été déplacé ou les coordonnées de son point d'ancrage ont été changées
if(id==CHARTEVENT_OBJECT_DRAG)
{
Print("Les coordonnées du point d'ancrage de l'objet ",sparam," ont été changées");
}
//--- le texte dans la zone d'édition de l'objet a été changé
if(id==CHARTEVENT_OBJECT_ENDEDIT)
{
Print("Le texte dans le champ Zone d'Edition de l'objet ",sparam," a été changé");
}
}
|
Pour l'évènement CHARTEVENT_MOUSE_MOVE le paramètre sparam de type string contient des informations sur l'état des touches du clavier et des boutons de la souris:
|
|
|
1
|
Etat du bouton gauche de la souris
|
2
|
Etat du bouton droit de la souris
|
3
|
Etat de la touche SHIFT
|
4
|
Etat de la touche CTRL
|
5
|
Etat du bouton du milieu de la souris
|
6
|
Etat du premier bouton supplémentaire de la souris
|
7
|
Etat du deuxième bouton supplémentaire de la souris
|
Exemple :
//+----------------------------------------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert |
//+----------------------------------------------------------------------------------------------------+
void OnInit()
{
//--- active les messages CHART_EVENT_MOUSE_MOVE
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
// --- désactiver le menu contextuel du graphique (à droite)
ChartSetInteger(0,CHART_CONTEXT_MENU,0);
// --- désactiver le réticule (par le bouton du milieu)
ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0);
//--- la mise à jour forcée des propriétés du graphique assure qu'elles seront prises en compte pour gérer les évènements
ChartRedraw();
}
//+----------------------------------------------------------------------------------------------------+
//| MouseState |
//+----------------------------------------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // souris gauche
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // souris droite
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // souris milieu
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // souris première bouton X
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // souris deuxième bouton X
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // touche shift
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // touche control
return(res);
}
//+----------------------------------------------------------------------------------------------------+
//| Fonction ChartEvent |
//+----------------------------------------------------------------------------------------------------+
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));
}
|
For the CHARTEVENT_MOUSE_WHEEL event, parameters lparam and dparam contain information about the states of the Ctrl and Shift keys, of mouse buttons, cursor coordinates and the mouse wheel scroll value. For a better understanding, run this Expert Advisor on a chart and scroll the mouse wheel, while pressing different buttons and holding down the keys described in the code.
Example of CHARTEVENT_MOUSE_WHEEL event processing:
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
init OnInit()
{
//--- Enabling mouse wheel scrolling messages
ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- La mise à jour forcée des propriétés du graphique assure qu'elles seront prises en compte pour gérer les évènements
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)
{
//--- Consider the state of mouse buttons and wheel for this event
int flg_keys = (int)(lparam>>32); // The flag of states of the Ctrl and Shift keys, and mouse buttons
int x_cursor = (int)(short)lparam; // the X coordinate where the mousse wheel event occurred
int y_cursor = (int)(short)(lparam>>16); // the Y coordinate where the mousse wheel event occurred
int delta = (int)dparam; // the total value of mouse scroll, triggers when +120 or -120 is reached
//--- Processing the 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);
}
}
//+------------------------------------------------------------------+ /*
Example of the 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 */
|
Voir aussi
Fonctions de Gestion des Evènements, Travailler avec les évènements