MQL로 작성된 UI 갤러리 - 페이지 15

 
Nikolai Semko #:

표트르, 이해가 안 돼요.

프로그래머는 작업하는 동안 GUI와 상호 작용하는 방법을 아는 것이 중요합니다. 다음은 제 GUI의 예입니다. 밝게/어두운 테마 바로 가기를 클릭하면 이 이벤트가 즉시 배경색과 선을 변경하는 기능을 트리거했습니다. 이 상호작용은 어떻게 하나요?



" 사용자가 내 코드와 (전혀) 상호 작용하지 않습니다 . "는 무슨 뜻인가요? 프로그래머는 코드가 아니라 코드가 생성해야 하는 이벤트와 상호 작용해야 합니다.

좋아요. 명확성을 위해 그림만 사용하겠습니다.

1.





2.


3.


4.

옵션 시트와 창에 있는 체크박스, 그리고 Internal_API 파일:




5. 창 및 사용자 코드의 항목에 대한 작업 수행:




6.


인텔리센스가 모든 것을 알려줍니다!!!


 
좋아요.

다른 질문을 해보겠습니다. 웹 개발을 예로 들어 보겠습니다. GUI는 사용자가 만든 마크업 언어를 사용하여 작성되었기 때문입니다.
웹 개발에는 자체 마크업 언어(HTML)와 스타일 언어(CSS)도 있습니다. HTML로만 웹 사이트를 만든 경우 순수한 HTML로 컨트롤을 만들 수 있습니다.




다음은 확인란이있는 예입니다. 그러나이 경우 컨트롤이 작동 할 때 아무 일도 일어나지 않기 때문에 사이트가 죽습니다. 무언가를 만들려면 JavaScript와 addEventListener 함수를 사용하여 각 이벤트에 대한 핸들러를 넣어야합니다. 다음은 이러한 핸들러의 예입니다: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 내 주요 질문은 다시 말할 수 있습니다 : 사용자가 작업 할 때 GUI에서 생성 된 이벤트 핸들러를프로그래머에게 어떻게 구현할 수 있습니까?
즉, 추가 이벤트 리스너의 아날로그는 무엇인가요? 앞서 말했듯이, 프로그래밍 방식으로 GUI가 생성될 때함수에 대한 포인터를 사용하여 각 컨트롤에 자체 이벤트 핸들러 함수가 할당된다는 사실을 통해 구현했습니다.
 
요소에서 값을 가져 오는 그림에서 값이 쓰여지는 변수를 쓰는 것을 잊었습니다. 죄송합니다. 오랫동안 프로그래밍을 하지 않아서요.))))))
 
Nikolai Semko #:
좋아요.

다른 질문을 해보겠습니다. 웹 개발을 예로 들어 보겠습니다. GUI는 사용자가 만든 마크업 언어를 사용하여 작성되었기 때문입니다.
웹 개발에는 자체 마크업 언어(HTML)와 스타일 언어(CSS)도 있습니다. HTML로만 웹 사이트를 만든 경우 순수한 HTML로 컨트롤을 만들 수 있습니다.




다음은 확인란이있는 예입니다. 그러나이 경우 컨트롤이 작동 할 때 아무 일도 일어나지 않기 때문에 사이트가 죽습니다. 무언가를 만들려면 JavaScript와 addEventListener 함수를 사용하여 각 이벤트에 대한 핸들러를 넣어야합니다. 다음은 이러한 핸들러의 예입니다: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 내 주요 질문은 다시 말할 수 있습니다 : 사용자가 작업 할 때 GUI에서 생성 된 이벤트 핸들러를프로그래머에게 어떻게 구현할 수 있습니까?
즉, 추가 이벤트 리스너에 대한 아날로그는 무엇입니까? 내가 말했듯이 GUI가 프로그래밍 방식으로 생성 될 때 각 컨트롤에함수에 대한 포인터를 사용하여 자체 이벤트 핸들러 함수가 할당된다는 사실을 통해 구현했습니다.

니콜라스, 모든 것이 작동합니다. 나중에 직접 사용해 보세요. 모든 것이 생각보다 훨씬 간단합니다. 저는 이 기술을 사용하여 많은 작업 인터페이스를 만들었습니다. 그래서... 곧 알게 될 것입니다.

 
Реter Konow #:

니콜라이, 작동해요. 나중에 직접 해보세요. 생각보다 훨씬 간단합니다. 저는 이 기술을 사용하여 많은 작업 인터페이스를 만들었습니다. 그래서... 곧 알게 되실 겁니다.

알았어요 기다릴게요.
여러분의 창작물을 정말 이해하고 싶습니다. 그러나 예를 들어 이해하기 쉽도록 GUI가 별도의 버튼 형태로 연결되어 있고, 누르면 창의 배경색이 검정에서 흰색으로, 흰색에서 검정으로 바뀌는 간단한 빈 표시기(또는 전문가 조언자)를 만들어주세요. 색상 변경은 연결된 파일 중 하나가 아닌 표시기 본문에서만 발생하는 것이 바람직합니다.
프로그래머가 실제로 코드에 들어가서는 안되기 때문입니다. 작성의 편의를 위해 버튼을 눌렀을 때 프로그램 본문에서 실행되어야하는 기능의 코드는 다음과 같습니다:

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 #:

알았어요. 기다리겠습니다.
그러나 예를 들어 이해하기 쉽도록 GUI가 별도의 버튼 형태로 연결되어 있고, 이를 누르면 창의 배경색이 검은색에서 흰색으로, 흰색에서 검은색으로 바뀌는 간단한 빈 표시기(또는 전문가 조언자)를 만들어 주세요. 색상 변경은 연결된 파일 중 하나가 아닌 표시기 본문에서만 발생하는 것이 바람직합니다.
프로그래머가 실제로 코드에 들어가서는 안되기 때문입니다. 작성의 편의를 위해 버튼을 눌렀을 때 프로그램 본문에서 실행되어야하는 기능의 코드는 다음과 같습니다:

Ok. 이해를 돕기 위해 가능한 가장 간단하게 구현하겠습니다. 군더더기 없이요).

  • 표시기
  • 표시기 안에는 사용자 창이 있습니다.
  • 창에는 버튼이 하나 있습니다.
  • 버튼은 함수를 호출합니다.
  • 모든 작업은 표시기 본문에 기록됩니다.
 
Реter Konow #:

좋아요. 이해를 돕기 위해 최대한 간단하게 구현해 보겠습니다. 군더더기 없이요).

  • 인디케이터
  • 표시기 안에는 사용자 창이 있습니다.
  • 창에는 버튼이 하나 있습니다.
  • 이 버튼은 함수를 호출합니다.
  • 모든 작업은 표시기 본문에 기록됩니다.

멋지네요! 감사합니다.

 

Nikolay, 표시기 본문 안에 함수 호출을 작성할 수 없는 이유는 핸들러가 Internal_API.mqh 파일 안에 있기 때문입니다.

즉, 이 파일의 핸들러에서 버튼을 누르는 이벤트에 대해 함수를 호출할 수 있습니다. 그러나 예를 들어 타이머 이벤트의 표시기 본문에서 프로그래밍 방식으로 버튼 상태를 설정할 수 있습니다. 그러면 버튼을 누를 필요가 없습니다. 요컨대, 다양한 요소가 있습니다. 일부는 표시기 본문 내에서 처리할 수 있으며(예를 들어 진행률 표시줄과 같은 대부분 비대화형 요소), 내부_API.mqh 파일에 핸들러가 있고 거기에서 작동하는 요소도 있습니다. 이러한 상태는 EA/지표 본문에서 프로그래밍 방식으로 설정할 수 있습니다.

작업이 완료되었습니다. (흰색 사각형이 있는 경우 - 클릭)


코드:

//+------------------------------------------------------------------+
//|                                                 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);
}

컴파일러가 욕을 해서 함수에 주석을 달았습니다. 더 간단하게 만들었습니다.


다음은 Internal_API.mqh 파일에 있는 코드입니다.



 

그런데 추가해야 합니다:

Internal_API.mqh 파일에는 제어 핸들러가 포함되어 있으며 특별히 이를 연결하도록 설계되었습니다.

이 파일은 사용자를 위한 것이며 엔진이나 다른 코드의 일부가 아닙니다.

 
Реter Konow 컨트롤의 핸들러가 포함되어 있으며 특별히 연결하도록 설계되었습니다.

이 파일은 사용자를 위한 것이며 엔진이나 다른 코드의 일부가 아닙니다.

알겠습니다, 피터.
고마워요. 물론 개발자에게는 편리하지 않죠.
불필요한 코드와 움직임이 많기 때문입니다. 그래도 함수에 대한 포인터가 있는 변형이 훨씬 낫습니다.