ライブラリ: マルチテスター - ページ 54

 
hini #:

コードはロシア語と英語だけをチェックする

もし誰かが他の言語のスタートボタンの名前を教えてくれたら、ソースコードに含めます。
 
fxsaber #:
もし誰かが他の言語のスタートボタンの名前を教えてくれたら、私はそれをソースに含めるつもりだ。
中国語の場合、「開始」と「停止」ボタンのテキストは以下の通りです:「开始」と「停止」。
 
hini #:
中国語の場合、「開始」と「停止」ボタンのテキストは以下の通り:"开始 "と "停止 "です。
更新されました。
 
fxsaber #:
更新しました。
ボタンから文字列を読み取って、それが変わらないか変わったかを比較する方が簡単かも?たくさんの言語がありますが、ボタンの状態は2つしかありません。
 
Stanislav Korotky #:
ボタンから文字列を読み取って、それが変わらないか変わったかを比較する方が簡単ではないだろうか?

結局のところ、この機能は以前の状態に依存すべきではない。色を使う方が簡単だろう:緑は開始、それ以外は停止。しかし、私はWinAPIですべてをpokeメソッドで行うので、ボタンの色(緑のコンポーネント)を読み取る方法がわかりません。もちろん、動作するバリアントがあれば、それを置き換えます。

 
fxsaber #:

それでも、この機能は以前の状態に依存すべきではない。色を使う方が簡単だろう:緑-開始、それ以外-停止。しかし、私はWinAPIですべてpokeメソッドでやっているので、ボタンの色(緑のコンポーネント)を読み取る方法を知らない。もちろん、動作するバリアントがあれば、それを置き換えます。

このコードは私がテストし、動作することを確認しています。

(将来MT5の開発者が色を変更するかもしれません)。

//+------------------------------------------------------------------+
//|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))
//+------------------------------------------------------------------+
//| スタート」ボタンのハンドルを取得|
//+------------------------------------------------------------------+
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;
}

//+------------------------------------------------------------------+
//| 一般的な色検出機能:ボタンが特定の色かどうかをチェックする。
//| 位置はプリセットのRGBカラーと一致する。
//+------------------------------------------------------------------+
bool IsButtonBackgroundColor(HWND hButton, color targetClr) {
  if(!hButton || !user32::IsWindow(hButton)) return false;
  // 1.画面上のボタン位置を取得する
  RECT rect;
  user32::GetWindowRect(hButton, rect);
  // 2.サンプリングポイント:左端から20ピクセル、垂直中央(テキストを避ける)
  int targetX = rect.left + 20;
  int targetY = rect.top + (rect.bottom - rect.top) / 2;
  // 画面サンプリング
  HANDLE hdcScreen = user32::GetDC(NULL);
  uint clr = gdi32::GetPixel(hdcScreen, targetX, targetY);
  user32::ReleaseDC(NULL, hdcScreen);
  if(clr == 0xFFFFFFFF) return false;
  return targetClr == clr;
}
//+------------------------------------------------------------------+
//| スクリプト・エントリ・ポイント OnStart|
//+------------------------------------------------------------------+
void OnStart() {
  HWND hBtn = (HWND)GetStartBtnHandle();
  if(hBtn == 0) return;
  // --- ユーザーのニーズに基づいたフレキシブルなコール --- --- --- --- ユーザーのニーズに基づいたフレキシブルなコール --- --- --- --- ユーザーのニーズに基づいたフレキシブルなコール
  // Check for: ライトテーマの緑 (156, 204, 101) hover:140, 188, 85
  bool isLightGreen = IsButtonBackgroundColor(hBtn, C'156, 204, 101') || 
                      IsButtonBackgroundColor(hBtn, C'140, 188, 85');
  
  // チェック対象:ダークテーマの緑 (96, 96, 0) hover:80, 80, 0
  bool isDarkGreen = IsButtonBackgroundColor(hBtn, C'96, 96, 0') || 
                     IsButtonBackgroundColor(hBtn, C'80, 80, 0');
  
  // Check for: ライトテーマの赤 (239, 154, 154) hover:223, 138, 138
  bool isLightRed = IsButtonBackgroundColor(hBtn, C'239, 154, 154') || 
                    IsButtonBackgroundColor(hBtn, C'223, 138, 138');
  
  // チェック対象:ダークテーマの赤 (112, 14, 19) hover:128, 30, 35
  bool isDarkRed = IsButtonBackgroundColor(hBtn, C'112, 14, 19') || 
                   IsButtonBackgroundColor(hBtn, C'128, 30, 35');
  // ビジネス・ロジック
  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ですべてpokeメソッドでやっているので、ボタンの色(緑のコンポーネント)を読み取る方法を知らない。もちろん、動作するバリアントがあれば、それを置き換えます。

ボタンの色ではなく、Inputsリストの状態(enabled/disabled)で判断した方が簡単かもしれない。
 
Stanislav Korotky #:
ボタンの色ではなく、入力リストのステータス(有効/無効)で確認するのが簡単でしょう。
Inputsのステータスはどこで取得できますか?公式APIはないので、色とテキストで判断するしかない。
 
hini #:
インプットのステータスはどこで入手できますか?公式APIはありません。色とテキストで判断するしかありません。

そうですね、MT5内部には公式なAPIはありません。MS Spyのようなユーティリティを使用して検査する必要があります。

Inputsの荒野に入らず、すでにテスト済みのスタートボタンだけを使用する場合、GetWindowLongW(hwnd, 0)コールはボタンの現在の色を返す必要があるようです。私のは緑で0xD0B1DF10を返します。MQがスタイルを修正することに決めた場合のみ、この設定はなくなるかもしれない。そのため、Inputsのアクティビティをチェックする方が確実である。

 
Stanislav Korotky #:

GetWindowLongW(hwnd,0)コールはボタンの現在の色を返すはずです。緑は0xD0B1DF10 です。

GetPixelは別のGカラーを返すようです。