Библиотеки: MultiTester - страница 54

 
hini #:
У меня не получается отладить и запустить MultiTester_Example на моем 5430, и IsReady постоянно возвращает false. У вас все работает нормально?

Я нашел причину. Код проверяет только русский и английский языки, из-за чего возникает ошибка. Вот подсказка для пользователей других языков: bool Res = (Name == "Старт") || (Name == "Start")

 
hini #:

Код проверяет только русский и английский языки

Если кто-то даст название кнопки Start на других языках, включу в исходник.
 
fxsaber #:
Если кто-то даст название кнопки Start на других языках, включу в исходник.
Для китайского языка текст кнопок «Старт» и «Стоп» выглядит следующим образом: «开始» и «停止».
 
hini #:
Для китайского языка текст кнопок «Старт» и «Стоп» выглядит следующим образом: «开始» и «停止».
Обновил.
 
fxsaber #:
Обновил.
Может проще считывать строку из кнопки и потом сравнивать, осталась ли она прежней или изменилась? Языков то много, а состояний у кнопки - всего два.
 
Stanislav Korotky #:
Может проще считывать строку из кнопки и потом сравнивать, осталась ли она прежней или изменилась?

Все же функция не должна быть зависимой от предыдущих состояний. Проще было бы по цвету: зеленая - старт, иначе - стоп. Но в WinAPI методом тыка все делаю, поэтому считывать цвет (Green-составляющую) кнопки не умею. Если будет рабочий вариант, конечно, заменю.

 
fxsaber #:

Все же функция не должна быть зависимой от предыдущих состояний. Проще было бы по цвету: зеленая - старт, иначе - стоп. Но в WinAPI методом тыка все делаю, поэтому считывать цвет (Green-составляющую) кнопки не умею. Если будет рабочий вариант, конечно, заменю.

Данный код был протестирован мной и подтверждено, что он работает.

(Рекомендую сохранить оба метода, возможно в будущем разработчики MT5 изменят цвета.)

//+------------------------------------------------------------------+
//|                                              CheckButtonColor.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))
//+------------------------------------------------------------------+
//| Get handle of "Start" button                                     |
//+------------------------------------------------------------------+
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;
}

//+------------------------------------------------------------------+
//| Generic color detection function: Check if button's specific     |
//| position matches the preset RGB color                            |
//+------------------------------------------------------------------+
bool IsButtonBackgroundColor(HWND hButton, color targetClr) {
  if(!hButton || !user32::IsWindow(hButton)) return false;
  // 1. Get button position on screen
  RECT rect;
  user32::GetWindowRect(hButton, rect);
  // 2. Sampling point: 20 pixels from left edge, vertical center (avoid text)
  int targetX = rect.left + 20;
  int targetY = rect.top + (rect.bottom - rect.top) / 2;
  // 3. Screen sampling
  HANDLE hdcScreen = user32::GetDC(NULL);
  uint clr = gdi32::GetPixel(hdcScreen, targetX, targetY);
  user32::ReleaseDC(NULL, hdcScreen);
  if(clr == 0xFFFFFFFF) return false;
  return targetClr == clr;
}
//+------------------------------------------------------------------+
//| Script entry point OnStart                                       |
//+------------------------------------------------------------------+
void OnStart() {
  HWND hBtn = (HWND)GetStartBtnHandle();
  if(hBtn == 0) return;
  // --- Flexible calls based on user needs ---
  // Check for: Light theme green (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');
  
  // Check for: Light theme red (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');
  // Business logic
  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 #:

Все же функция не должна быть зависимой от предыдущих состояний. Проще было бы по цвету: зеленая - старт, иначе - стоп. Но в WinAPI методом тыка все делаю, поэтому считывать цвет (Green-составляющую) кнопки не умею. Если будет рабочий вариант, конечно, заменю.

Проще наверно не по цвету кнопки, а по состоянию списка Inputs - enabled/disabled.
 
Stanislav Korotky #:
Проще наверно не по цвету кнопки, а по состоянию списка Inputs - enabled/disabled.
Где же получить статус Inputs? Официального API нет, приходится определять его по цветам и тексту.
 
hini #:
Где же получить статус Inputs? Официального API нет, приходится определять его по цветам и тексту.

Ну, так про все внутренности МТ5 нет официального API - нужно инспектировать через утилиты типа MS Spy - так ведь и были найдены идентификаторы контролов, которые сейчас в мультитестере используются.

Если пока не внедряться в дебри с Inputs и окучивать уже проверенную кнопку старт, то похоже вызов GetWindowLongW(hwnd, 0) должен выдавать текущий цвет кнопки. У меня возвращает 0xD0B1DF10 для зеленой. Только если MQ решит поправить стиль, то эта настройка может слететь. Поэтому проверка активности Inputs по любому более надежна.