//+------------------------------------------------------------------+
//| Panel_Buttons.mq5 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Panneau avec plusieurs boutons CButton"
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
//+------------------------------------------------------------------+
//| defines |
//+------------------------------------------------------------------+
//--- décalages et espaces
#define INDENT_LEFT (11) // décalage depuis la gauche (en respectant la largeur de la bordure)
#define INDENT_TOP (11) // décalage depuis le haut (en respectant la largeur de la bordure)
#define CONTROLS_GAP_X (5) // coordonnée X de l'espace
#define CONTROLS_GAP_Y (5) // coordonnée Y de l'espace
//--- pour les boutons
#define BUTTON_WIDTH (100) // largeur du bouton
#define BUTTON_HEIGHT (20) // hauteur du bouton
//--- pour la zone de texte
#define EDIT_HEIGHT (20) // hauteur
//--- crée le type personnalisé de fonction
typedef int(*TAction)(string,int);
//+------------------------------------------------------------------+
//| Ouvre le fichier |
//+------------------------------------------------------------------+
int Open(string name,int id)
{
PrintFormat("Fonction %s appelée (nom=%s id=%d)",__FUNCTION__,name,id);
return(1);
}
//+------------------------------------------------------------------+
//| Sauvegarde le fichier |
//+------------------------------------------------------------------+
int Save(string name,int id)
{
PrintFormat("Fonction %s appelée (nom=%s id=%d)",__FUNCTION__,name,id);
return(2);
}
//+------------------------------------------------------------------+
//| Ferme le fichier |
//+------------------------------------------------------------------+
int Close(string name,int id)
{
PrintFormat("Fonction %s appelée (nom=%s id=%d)",__FUNCTION__,name,id);
return(3);
}
//+------------------------------------------------------------------+
//| Crée la classe du bouton avec traitement des évènements |
//+------------------------------------------------------------------+
class MyButton: public CButton
{
private:
TAction m_action; // handler des évènements du graphique
public:
MyButton(void){}
~MyButton(void){}
//--- constructeur spécifiant le texte du bouton et le pointeur vers la fonction de gestion des évènements
MyButton(string text,TAction act)
{
Text(text);
m_action=act;
}
//--- définit la fonction personnalisée appelée depuis le gestionnaire d'évènements OnEvent()
void SetAction(TAction act){m_action=act;}
//--- gestionnaire standard d'évènements du graphique
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) override
{
if(m_action!=NULL && lparam==Id())
{
//--- appelle le gestionnaire personnalisé
m_action(sparam,(int)lparam);a
return(true);
}
else
//--- retourne le résultat de l'appel au gestionnaire depuis la classe parente CButton
return(CButton::OnEvent(id,lparam,dparam,sparam));
}
};
//+------------------------------------------------------------------+
//| Classe CControlsDialog |
//| Objectif : panneau graphique de gestion de l'application |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
{
private:
CArrayObj m_buttons; // tableau de boutons
public:
CControlsDialog(void){};
~CControlsDialog(void){};
//--- création
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) override;
//--- ajoute le bouton
bool AddButton(MyButton &button){return(m_buttons.Add(GetPointer(button)));m_buttons.Sort();};
protected:
//--- crée les boutons
bool CreateButtons(void);
};
//+------------------------------------------------------------------+
//| Crée l'objet CControlsDialog sur le graphique |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
return(false);
return(CreateButtons());
//---
}
//+------------------------------------------------------------------+
//| Crée et ajoute les boutons au panneau CControlsDialog |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButtons(void)
{
//--- calcule les coordonnées des boutons
int x1=INDENT_LEFT;
int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y);
int x2;
int y2=y1+BUTTON_HEIGHT;
//--- ajoute les objets boutons avec les pointeurs de fonctions
AddButton(new MyButton("Open",Open));
AddButton(new MyButton("Save",::Save));
AddButton(new MyButton("Close",Close));
//--- crée le bouton graphiquement
for(int i=0;i<m_buttons.Total();i++)
{
MyButton *b=(MyButton*)m_buttons.At(i);
x1=INDENT_LEFT+i*(BUTTON_WIDTH+CONTROLS_GAP_X);
x2=x1+BUTTON_WIDTH;
if(!b.Create(m_chart_id,m_name+"bt"+b.Text(),m_subwin,x1,y1,x2,y2))
{
PrintFormat("Echec de création du bouton %s %d",b.Text(),i);
return(false);
}
//--- ajoute chaque bouton au conteneur CControlsDialog
if(!Add(b))
return(false);
}
//--- succès
return(true);
}
//--- déclare l'objet au niveau global pour le créer automatiquement lors du lancement du programme
CControlsDialog MyDialog;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- crée maintenant l'objet sur le graphique
if(!MyDialog.Create(0,"Controls",0,40,40,380,344))
return(INIT_FAILED);
//--- lance l'application
MyDialog.Run();
//--- application initialisée avec succès
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Fonction de dé-initialisation de l'expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- détruit le dialogue
MyDialog.Destroy(reason);
}
//+------------------------------------------------------------------+
//| Fonction d'évènement du graphique de l'expert |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // identifiant 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
{
//--- appelle le handler depuis la classe parent (ici CAppDialog) pour les évènements du graphique
MyDialog.ChartEvent(id,lparam,dparam,sparam);
}
|