Bibliothèque: MultiTester - page 54

 
hini #:

Le code ne vérifie que les langues russe et anglaise

Si quelqu'un donne le nom du bouton Start dans d'autres langues, je l'inclurai dans le code source.
 
fxsaber #:
Si quelqu'un donne le nom du bouton Start dans d'autres langues, je l'inclurai dans la source.
Pour le chinois, le texte des boutons Start et Stop est le suivant : "开始" et "停止".
 
hini #:
En chinois, le texte des boutons "Start" et "Stop" est le suivant : "开始" et "停止".
Mise à jour.
 
fxsaber #:
Mise à jour.
Peut-être est-il plus facile de lire une chaîne de caractères à partir du bouton et de comparer ensuite si elle est restée la même ou si elle a changé ? Il y a beaucoup de langues, mais le bouton n'a que deux états.
 
Stanislav Korotky #:
Ne serait-il pas plus simple de lire une chaîne de caractères à partir du bouton et de comparer ensuite si elle est restée la même ou si elle a changé ?

Après tout, la fonction ne devrait pas dépendre d'états antérieurs. Il serait plus facile d'utiliser la couleur : vert - démarrage, sinon - arrêt. Mais je fais tout dans WinAPI par la méthode poke, donc je ne sais pas comment lire la couleur (composante verte) du bouton. S'il existe une variante qui fonctionne, je la remplacerai bien sûr.

 
fxsaber #:

Toutefois, la fonction ne devrait pas dépendre des états précédents. Il serait plus facile d'utiliser la couleur : vert - démarrage, sinon - arrêt. Mais je fais tout dans WinAPI par la méthode poke, donc je ne sais pas comment lire la couleur (composante verte) du bouton. S'il existe une variante qui fonctionne, je la remplacerai bien sûr.

Ce code a été testé par mes soins et il est confirmé qu'il fonctionne.

(Je recommande de garder les deux méthodes, peut-être qu'à l'avenir les développeurs de MT5 changeront les couleurs).

//+------------------------------------------------------------------+
//|Couleur du bouton de contrôle.mq5|
//+------------------------------------------------------------------+
#include <WinAPI/winapi.mqh>

#define private public
#include <fxsaber/MultiTester/MTTester.mqh>
#undef private

#ifdef __MQL5__
#define  ULONG_PTR   ulong
#else
#define  ULONG_PTR   uint
#endif

#define  WORD           int
#define  DWORD_PTR      ULONG_PTR
#define  BYTE           uchar

#define  LOBYTE(w)           ((BYTE)(((DWORD_PTR)(w)) & 0xff))
#define  GetRValue(rgb)      (LOBYTE(rgb))
#define  GetGValue(rgb)      (LOBYTE(((WORD)(rgb)) >> 8))
#define  GetBValue(rgb)      (LOBYTE((rgb)>>16))
//+------------------------------------------------------------------+
//| Obtenir la poignée du bouton "Démarrer|
//+------------------------------------------------------------------+
long GetStartBtnHandle(void) {
  static const int ControlID[] = {0xE81E, 0x804E, 0x2712, 0x4196};
  static const long Handle = MTTESTER::GetHandle(ControlID);
  if(Handle <= 0) return 0;
  return Handle;
}

//+------------------------------------------------------------------+
//| Fonction générique de détection de la couleur : vérifier si le bouton est spécifique à la couleur.
//| la position correspond à la couleur RGB prédéfinie |
//+------------------------------------------------------------------+
bool IsButtonBackgroundColor(HWND hButton, color targetClr) {
  if(!hButton || !user32::IsWindow(hButton)) return false;
  // 1. obtenir la position du bouton sur l'écran
  RECT rect;
  user32::GetWindowRect(hButton, rect);
  // 2. Point d'échantillonnage : 20 pixels du bord gauche, centre vertical (éviter le texte)
  int targetX = rect.left + 20;
  int targetY = rect.top + (rect.bottom - rect.top) / 2;
  // 3. échantillonnage de l'écran
  HANDLE hdcScreen = user32::GetDC(NULL);
  uint clr = gdi32::GetPixel(hdcScreen, targetX, targetY);
  user32::ReleaseDC(NULL, hdcScreen);
  if(clr == 0xFFFFFFFF) return false;
  return targetClr == clr;
}
//+------------------------------------------------------------------+
//| Point d'entrée du script OnStart|
//+------------------------------------------------------------------+
void OnStart() {
  HWND hBtn = (HWND)GetStartBtnHandle();
  if(hBtn == 0) return;
  // --- Appels flexibles basés sur les besoins de l'utilisateur ---
  // Recherche : thème vert clair (156, 204, 101) hover:140, 188, 85
  bool isLightGreen = IsButtonBackgroundColor(hBtn, C'156, 204, 101') || 
                      IsButtonBackgroundColor(hBtn, C'140, 188, 85');
  
  // Check for : Dark theme green (96, 96, 0) hover:80, 80, 0
  bool isDarkGreen = IsButtonBackgroundColor(hBtn, C'96, 96, 0') || 
                     IsButtonBackgroundColor(hBtn, C'80, 80, 0');
  
  // Vérifie : thème clair rouge (239, 154, 154) hover:223, 138, 138
  bool isLightRed = IsButtonBackgroundColor(hBtn, C'239, 154, 154') || 
                    IsButtonBackgroundColor(hBtn, C'223, 138, 138');
  
  // Check for : Dark theme red (112, 14, 19) hover:128, 30, 35
  bool isDarkRed = IsButtonBackgroundColor(hBtn, C'112, 14, 19') || 
                   IsButtonBackgroundColor(hBtn, C'128, 30, 35');
  // Logique d'entreprise
  if(isLightGreen || isDarkGreen) {
    Print("Current button state: Green (Ready to start)");
  } else if(isLightRed || isDarkRed) {
    Print("Current button state: Red (Running/Stopped)");
  } else {
    Print("Current button state: Other color/Unknown");
  }
}
//+------------------------------------------------------------------+
 
fxsaber #:

Toutefois, la fonction ne devrait pas dépendre des états précédents. Il serait plus facile d'utiliser la couleur : vert - démarrage, sinon - arrêt. Mais je fais tout dans WinAPI par la méthode poke, donc je ne sais pas comment lire la couleur (composante verte) du bouton. S'il existe une variante qui fonctionne, je la remplacerai bien sûr.

Ce n'est probablement pas la couleur du bouton qui est la plus simple, mais l'état de la liste des entrées - activées/désactivées.
 
Stanislav Korotky #:
Ce n'est probablement pas la couleur du bouton qui facilite les choses, mais l'état de la liste des entrées - activées/désactivées.
Où obtenir l'état des entrées ? Il n'y a pas d'API officielle, nous devons le déterminer par les couleurs et le texte.
 
hini #:
Où obtenir l'état des entrées ? Il n'y a pas d'API officielle, nous devons le déterminer par des couleurs et du texte.

En fait, il n'y a pas d'API officielle pour tous les éléments internes de MT5 - vous devez les inspecter à l'aide d'utilitaires comme MS Spy - c'est ainsi que les identificateurs de contrôle ont été trouvés, qui sont maintenant utilisés dans le multitester.

Si vous ne vous aventurez pas dans les méandres des Inputs et que vous utilisez simplement le bouton de démarrage déjà testé, il semble que l'appel GetWindowLongW(hwnd, 0) devrait renvoyer la couleur actuelle du bouton. Le mien renvoie 0xD0B1DF10 pour le bouton vert. Ce n'est que si MQ décide de corriger le style que ce paramètre pourrait disparaître. Il est donc plus fiable de vérifier l'activité des entrées.

 
Stanislav Korotky #:

il semble que l'appel GetWindowLongW(hwnd, 0) devrait renvoyer la couleur actuelle du bouton. J'obtiens 0xD0B1DF10 pour le bouton vert.

GetPixel semble renvoyer une couleur G différente.