Galerie d'interfaces utilisateur écrites en MQL - page 15

 
Nikolai Semko #:

Pyotr, je ne te comprends pas.

Vous n'avez pas répondu aux questions. Il est important pour les programmeurs de savoir comment interagir avec votre interface graphique pendant qu'ils travaillent. Voici un exemple de mon interface graphique. J'ai cliqué sur le raccourci du thème clair/foncé et cet événement a immédiatement déclenché la fonction permettant de modifier les couleurs et les lignes d'arrière-plan. Comment réaliser cette interaction ?



Que signifie "L'utilisateur n'interagira PAS (du tout) avec mon code " ? Le programmeur doit interagir non pas avec le code, mais avec les événements que le code doit générer.

C'est bien. Je vais essayer d'utiliser des images pour plus de clarté.

1.





2.


3.


4.

Notre feuille d'options, la case à cocher dans la fenêtre et le fichier Internal_API :




5. Exécution d'actions sur la fenêtre et les éléments dans le code utilisateur :




6.


INTELLISENSE NOUS DIT TOUT!!!


 
JE VAIS ESSAYER DE POSER UNE AUTRE QUESTION.

Je vais essayer de poser une question différente, en prenant l'exemple du développement web. Parce que votre interface graphique est écrite en utilisant le langage de balisage que vous avez créé, le développement web a également son propre langage de balisage (HTML) et son propre langage de style (CSS).
Le développement web a également son propre langage de balisage (HTML) et son propre langage de style (CSS). Si vous avez créé un site web uniquement en HTML, vous pouvez créer des contrôles en HTML pur.




Voici un exemple avec une case à cocher. Mais dans ce cas, le site sera mort, car il ne se passera rien lorsque les contrôles fonctionneront. Pour que quelque chose se passe, vous devez mettre en place un gestionnaire pour chaque événement en utilisant JavaScript et la fonction addEventListener Voici un exemple d'un tel gestionnaire: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 Ma question principale peut être reformulée : Comment implémentez-vouspour le programmeur le gestionnaire d'événement généré par l'interface graphique lorsque l'utilisateur travaille.
Comme je l'ai dit, je l'ai implémenté par le fait que lorsque l'interface graphique est générée par programme, chaque contrôle se voit attribuer sa propre fonction de gestion d'événements en utilisant un pointeur vers une fonction.
 
Dans l'image de l'obtention d'une valeur à partir d'un élément, j'ai oublié d'écrire la variable dans laquelle elle est écrite. Désolé, je n'ai pas programmé depuis longtemps.))))))
 
Nikolai Semko #:
JE VAIS ESSAYER DE POSER UNE AUTRE QUESTION.

Je vais essayer de poser une question différente, en prenant l'exemple du développement web. Parce que votre interface graphique est écrite en utilisant le langage de balisage que vous avez créé, le développement web a également son propre langage de balisage (HTML) et son propre langage de style (CSS).
Le développement web a également son propre langage de balisage (HTML) et son propre langage de style (CSS). Si vous avez créé un site web uniquement en HTML, vous pouvez créer des contrôles en HTML pur.




Voici un exemple avec une case à cocher. Mais dans ce cas, le site sera mort, car il ne se passera rien lorsque les contrôles fonctionneront. Pour que quelque chose se passe, vous devez mettre en place un gestionnaire pour chaque événement en utilisant JavaScript et la fonction addEventListener Voici un exemple d'un tel gestionnaire: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 Ma question principale peut être reformulée : Comment implémentez-vouspour le programmeur le gestionnaire d'événement généré par l'interface graphique lorsque l'utilisateur travaille.
Comme je l'ai dit, je l'ai implémenté par le fait que lorsque l'interface graphique est générée par programme, chaque contrôle se voit attribuer sa propre fonction de gestion d'événements en utilisant un pointeur sur la fonction.

Nicolas, tout fonctionne. Vous l'essaierez vous-même plus tard. Tout est beaucoup plus simple que vous ne le pensez. J'ai réalisé de nombreuses interfaces fonctionnelles à l'aide de cette technologie. Alors... Vous verrez bien assez tôt.

 
Реter Konow #:

Nikolaï, ça marche. Tu l'essaieras toi-même plus tard. C'est beaucoup plus simple que vous ne le pensez. J'ai réalisé de nombreuses interfaces fonctionnelles en utilisant cette technologie. Alors... Tu verras bien assez tôt.

D'accord. J'attendrai, je veux vraiment comprendre votre création.
Cependant, pour faciliter la compréhension par l'exemple, veuillez créer un simple indicateur vide (ou Expert Advisor), dans lequel votre interface graphique est connectée sous la forme d'un bouton séparé, lorsque vous appuyez dessus, la couleur de fond de la fenêtre passe du noir au blanc et du blanc au noir. Il est souhaitable que le changement de couleur ait lieu dans le corps de l'indicateur et non dans l'un des fichiers connectés.
Pour simplifier l'écriture, voici le code de la fonction qui doit être exécutée dans le corps du programme lorsque l'on appuie sur le bouton :

void ChangeColorScheme() {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[2] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   static int clr_scheme = 0;
   if (clr_scheme == 1) clr_scheme = 0;
   else clr_scheme  = 1;

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}
 
Nikolai Semko #:

D'accord. Je veux vraiment comprendre votre création.
Cependant, pour faciliter la compréhension par un exemple, veuillez créer un simple indicateur vide (ou Expert Advisor), dans lequel votre interface graphique est connectée sous la forme d'un bouton séparé, lorsque vous appuyez dessus, la couleur de fond de la fenêtre passe du noir au blanc et du blanc au noir. Il est souhaitable que le changement de couleur ait lieu dans le corps de l'indicateur et non dans l'un des fichiers connectés.
Pour simplifier l'écriture, voici le code de la fonction qui doit être exécutée dans le corps du programme lorsque l'on appuie sur le bouton :

Ok. Je vais faire la mise en œuvre la plus simple possible pour la compréhension. Pas de fioritures).

  • Indicateur
  • A l'intérieur de l'indicateur se trouve une fenêtre utilisateur
  • Il y a un bouton dans la fenêtre
  • Le bouton appelle votre fonction.
  • Toutes les actions sont écrites dans le corps de l'indicateur.
 
Реter Konow #:

D'accord. Je vais faire la mise en œuvre la plus simple possible pour la compréhension. Pas de fioritures).

  • L'indicateur
  • A l'intérieur de l'indicateur se trouve une fenêtre utilisateur
  • Il y a un bouton dans la fenêtre
  • Le bouton appelle votre fonction.
  • Toutes les actions sont écrites dans le corps de l'indicateur.

C'est très bien ! Je vous remercie.

 

Nikolay, je ne peux pas écrire un appel de fonction dans le corps de l'indicateur, parce que son gestionnaire se trouve dans le fichier Internal_API.mqh.

En d'autres termes, je peux appeler votre fonction en cas d'appui sur le bouton à partir de son gestionnaire dans ce fichier. Cependant, je peux définir les états du bouton de manière programmatique à partir du corps de l'indicateur sur l'événement de la minuterie, par exemple. Mais dans ce cas, je n'ai pas besoin d'appuyer sur le bouton. En résumé, il existe différents éléments. Certains d'entre eux peuvent être gérés dans le corps de l'indicateur (principalement les éléments non interactifs, comme la barre de progression, par exemple) et il y a ceux qui ont un gestionnaire dans le fichier Internal_API.mqh et qui fonctionnent à partir de là. Bien que leurs états puissent être définis de manière programmatique à partir du corps de l'EA/indicateur.

Votre tâche est terminée. (si carré blanc - cliquez)


Code :

//+------------------------------------------------------------------+
//|                                                 Indicators 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include<GUI_DRIVE_2.mqh>
#include<MyProject_1\CORES.mqh>
#include<MyProject_1\Internal_API.mqh> 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- create timer
   EventSetMillisecondTimer(25);
   //-------------------------
   D_OnInit();
   //-------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //УСТАНОВИТЬ ВЫЗОВ В САМОМ НИЗУ, ПОД ПОЛЬЗ.КОДОМ.------------------
   //---------------------------
   RMSG(1);
   //---------------------------
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   //УСТАНОВИТЬ ВЫЗОВ НА САМОМ ВЕРХУ, НАД ПОЛЬЗ.КОДОМ.---------------
   //----------------------------------------------------------------
   D_OnChartEvent(id,lparam,dparam,sparam);
   //----------------------------------------------------------------
  }
//+------------------------------------------------------------------+

/*void ChangeColorScheme() {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[13] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   static int clr_scheme = 0;
   if (clr_scheme == 1) clr_scheme = 0;
   else clr_scheme  = 1;

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}*/


void ChangeColorScheme(uint _color)
{
 ChartSetInteger(0,CHART_COLOR_BACKGROUND,_color);
}

J'ai commenté votre fonction parce que le compilateur jurait. Je l'ai simplifiée.


Voici le code dans le fichier Internal_API.mqh



 

D'ailleurs, vous devriez ajouter :

Le fichier Internal_API.mqh contient des gestionnaires de contrôle et est spécifiquement conçu pour les connecter.

Ce fichier est destiné à l'utilisateur et ne fait pas partie du moteur ou de tout autre code.

 
Реter Konow contrôles et est spécifiquement conçu pour les connecter.

Ce fichier est destiné à l'utilisateur et ne fait pas partie du moteur ou de tout autre code.

Je vois, Peter.
Ce n'est pas pratique, bien sûr, pour un développeur.
Il y a beaucoup de code et de mouvements inutiles, mais la variante avec un pointeur sur une fonction est bien meilleure.