Kütüphaneler: MultiTester - sayfa 54

 
hini #:

Kod yalnızca Rusça ve İngilizce dillerini kontrol eder

Birisi Başlat düğmesinin diğer dillerdeki adını verirse, kaynak koduna ekleyeceğim.
 
fxsaber #:
Birisi Başlat düğmesinin diğer dillerdeki adını verirse, onu kaynağa ekleyeceğim.
Çince için Başlat ve Durdur düğmelerinin metni aşağıdaki gibidir: "开始" ve "停止".
 
hini #:
Çince için "Başlat" ve "Durdur" düğmelerinin metni aşağıdaki gibidir: "开始" ve "停止".
Güncellenmiştir.
 
fxsaber #:
Güncellendi.
Belki de düğmeden bir dize okumak ve ardından aynı kalıp kalmadığını veya değişip değişmediğini karşılaştırmak daha kolaydır? Çok sayıda dil var, ancak düğmenin yalnızca iki durumu var.
 
Stanislav Korotky #:
Düğmeden bir dize okumak ve ardından aynı kalıp kalmadığını veya değişip değişmediğini karşılaştırmak daha kolay olmaz mıydı?

Sonuçta, işlev önceki durumlara bağlı olmamalıdır. Renk kullanmak daha kolay olurdu: yeşil - başla, aksi halde - dur. Ancak WinAPI'de her şeyi poke yöntemiyle yapıyorum, bu yüzden düğmenin rengini (Yeşil bileşen) nasıl okuyacağımı bilmiyorum. Çalışan bir varyant varsa, elbette değiştireceğim.

 
fxsaber #:

Yine de, işlev önceki durumlara bağlı olmamalıdır. Renk kullanmak daha kolay olurdu: yeşil - başla, aksi halde - dur. Ancak WinAPI'de her şeyi poke yöntemiyle yapıyorum, bu yüzden düğmenin rengini (Yeşil bileşen) nasıl okuyacağımı bilmiyorum. Çalışan bir varyant varsa, elbette değiştireceğim.

Bu kod benim tarafımdan test edildi ve çalıştığı onaylandı.

(Her iki yöntemi de saklamanızı tavsiye ederim, belki gelecekte MT5 geliştiricileri renkleri değiştirir).

//+------------------------------------------------------------------+
//|CheckButtonColour.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))
//+------------------------------------------------------------------+
//| "Başlat" düğmesinin tutamacını al|
//+------------------------------------------------------------------+
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;
}

//+------------------------------------------------------------------+
//| Genel renk algılama işlevi: Düğmenin belirli olup olmadığını kontrol edin |
//| konum önceden ayarlanmış RGB rengiyle eşleşir |
//+------------------------------------------------------------------+
bool IsButtonBackgroundColor(HWND hButton, color targetClr) {
  if(!hButton || !user32::IsWindow(hButton)) return false;
  // 1. Ekrandaki düğme konumunu al
  RECT rect;
  user32::GetWindowRect(hButton, rect);
  // 2. Örnekleme noktası: Sol kenardan 20 piksel, dikey merkez (metinden kaçının)
  int targetX = rect.left + 20;
  int targetY = rect.top + (rect.bottom - rect.top) / 2;
  // 3. Ekran örneklemesi
  HANDLE hdcScreen = user32::GetDC(NULL);
  uint clr = gdi32::GetPixel(hdcScreen, targetX, targetY);
  user32::ReleaseDC(NULL, hdcScreen);
  if(clr == 0xFFFFFFFF) return false;
  return targetClr == clr;
}
//+------------------------------------------------------------------+
//| Kod giriş noktası OnStart|
//+------------------------------------------------------------------+
void OnStart() {
  HWND hBtn = (HWND)GetStartBtnHandle();
  if(hBtn == 0) return;
  // --- Kullanıcı ihtiyaçlarına göre esnek çağrılar ---
  // Şunun için kontrol edin: Açık tema yeşili (156, 204, 101) hover:140, 188, 85
  bool isLightGreen = IsButtonBackgroundColor(hBtn, C'156, 204, 101') || 
                      IsButtonBackgroundColor(hBtn, C'140, 188, 85');
  
  // Şunun için kontrol edin: Koyu tema yeşili (96, 96, 0) hover:80, 80, 0
  bool isDarkGreen = IsButtonBackgroundColor(hBtn, C'96, 96, 0') || 
                     IsButtonBackgroundColor(hBtn, C'80, 80, 0');
  
  // Şunun için kontrol edin: Açık tema kırmızı (239, 154, 154) hover:223, 138, 138
  bool isLightRed = IsButtonBackgroundColor(hBtn, C'239, 154, 154') || 
                    IsButtonBackgroundColor(hBtn, C'223, 138, 138');
  
  // Şunun için kontrol edin: Koyu tema kırmızı (112, 14, 19) hover:128, 30, 35
  bool isDarkRed = IsButtonBackgroundColor(hBtn, C'112, 14, 19') || 
                   IsButtonBackgroundColor(hBtn, C'128, 30, 35');
  // İş mantığı
  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 #:

Yine de, işlev önceki durumlara bağlı olmamalıdır. Renk kullanmak daha kolay olurdu: yeşil - başla, aksi halde - dur. Ancak WinAPI'de her şeyi poke yöntemiyle yapıyorum, bu yüzden düğmenin rengini (Yeşil bileşen) nasıl okuyacağımı bilmiyorum. Çalışan bir varyant varsa, elbette değiştireceğim.

Muhtemelen düğmenin renginden değil, Girişler listesinin durumundan (etkin/devre dışı) daha kolaydır.
 
Stanislav Korotky #:
Muhtemelen düğmenin rengine göre değil, Girişler listesinin durumuna göre daha kolaydır - etkin/devre dışı.
Girişlerin durumunu nereden öğrenebilirim? Resmi bir API yok, bunu renklere ve metne göre belirlememiz gerekiyor.
 
hini #:
Girişlerin durumunu nereden öğrenebilirim? Resmi bir API yok, bunu renklere ve metne göre belirlememiz gerekiyor.

Tüm MT5 dahili bileşenleri için resmi bir API yoktur - bunları MS Spy gibi yardımcı programlar aracılığıyla incelemeniz gerekir - şimdi multitester'da kullanılan kontrol tanımlayıcıları bu şekilde bulundu.

Girdilerin vahşi doğasına girmezseniz ve sadece zaten test edilmiş başlat düğmesini kullanırsanız, GetWindowLongW(hwnd, 0) çağrısının düğmenin mevcut rengini döndürmesi gerektiği görülüyor. Benimki yeşil olan için 0xD0B1DF10 döndürüyor. Yalnızca MQ stili düzeltmeye karar verirse, bu ayar ortadan kalkabilir. Bu yüzden Girişlerin etkinliğini kontrol etmek her halükarda daha güvenilirdir.