用 MQL 编写的用户界面图库 - 页 15

 
Nikolai Semko #:

Pyotr 我不明白你的意思。

你没有回答我的问题。 对于程序员来说,知道如何在工作时与图形用户界面交互是很重要的。 下面是我的图形用户界面的一个例子。我点击了明暗主题快捷键,这个事件立即触发了改变背景颜色和线条的功能。如何进行这种交互?



用户不会与我的代码进行(任何) 交互 "是什么意思? 程序员需要交互的不是代码,而是代码应该产生的事件

很好。为了清楚起见,我尽量只用图片。

1.





2.


3.


4.

我们的选项表、窗口中的复选框以及 Internal_API 文件:




5.在用户代码中对窗口和项目执行操作:




6.


intellisense 会告诉我们一切!!!..!


 
好的。

我试着问一个不同的问题,以网络开发为例,因为您的图形用户界面是使用您创建的标记语言编写的,网络开发也有自己的标记语言(HTML)和样式语言(CSS)。
网络开发也有自己的标记语言(HTML)和样式语言(CSS)。 如果你只用 HTML 创建了一个网站,你可以用纯 HTML 创建控件。




下面是一个带有复选框的示例。 但在这种情况下,网站将是死的,因为当控件工作时不会发生任何事情。 为了使事情发生,您需要使用 JavaScript 和 addEventListener 函数为每个事件添加一个处理程序。下面是这样一个处理程序的示例: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 我的主要问题可以换成:当用户工作时,您如何为程序员 实现图形用户界面生成的事件处理程序。正如我所说,我是这样实现:当图形用户界面以编程方式生成时,每个控件都会使用指向函数的指针 分配自己的事件处理函数。
 
在从元素获取值的图片中,我忘了写入值的变量。对不起,我很久没有编程了。))))))
 
Nikolai Semko #:
好的。我试着问一个不同的问题,以网络开发为例,因为您的图形用户界面是使用您创建的标记语言编写的,网络开发也有自己的标记语言(HTML)和样式语言(CSS)。网络开发也有自己的标记语言(HTML)和样式语言(CSS)。 如果你只用 HTML 创建了一个网站,你可以用纯 HTML 创建控件。下面是一个带有复选框的







示例。 但在这种情况下,网站将是死的,因为当控件工作时不会发生任何事情。 为了使事情发生,您需要使用 JavaScript 和 addEventListener 函数为每个事件添加一个处理程序。下面是这样一个处理程序的示例: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 我的主要问题可以换成:当用户工作时,您如何为程序员 实现图形用户界面生成的事件处理程序。正如我所说,我是这样实现:当图形用户界面以编程方式生成时,每个控件都会使用指向该函数的指针 分配自己的事件处理函数。

尼古拉斯,一切正常。你以后可以自己试试。一切都比你想象的要简单得多。我已经用这项技术制作了许多可用的界面。所以...你很快就会知道了

 
Реter Konow #:

尼古拉,成功了待会儿你自己试试这比你想象的要简单得多。我已经用这项技术制作了很多工作界面所以...你很快就会知道了

好的 我会等着的 Okay.我会等着的。不过,为了举例说明更容易理解,请创建一个简单的空指标(或智能交易系统),在其中以单独按钮的形式连接图形用户界面,当您按下按钮时,窗口的背景颜色会从黑色变为白色,又从白色变为黑色。只希望颜色变化发生在指标本体中,而不是连接的某个文件中。
以下是按下按钮后在程序体中执行的函数代码,以方便编写:

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

好吧 我等着 Okay.我等着。不过,为了举例说明更容易理解,请创建一个简单的空指标(或智能交易系统),在其中以单独按钮的形式连接图形用户界面,当您按下按钮时,窗口的背景颜色会从黑色变为白色,又从白色变为黑色。只希望颜色变化发生在指标本体中,而不是连接的某个文件中。
以下是按下按钮后在程序体中执行的函数代码,以方便编写:

好的。为了便于理解,我将采用最简单的实现方式。无修饰)。

  • 指示器
  • 指标内部有一个用户窗口
  • 窗口中有一个按钮
  • 按钮调用您的函数。
  • 所有操作都写在指示器的正文中。
 
Реter Konow #:

好的。为了便于理解,我会尽可能简单地实现。不加修饰)。

  • 指示器
  • 指标内部是一个用户窗口
  • 窗口中有一个按钮
  • 按钮调用您的函数。
  • 所有操作都写在指示器主体中。

很好!谢谢。

 

Nikolay,我无法在指示器主体中编写函数调用,因为其处理程序位于 Internal_API.mqh 文件中。

也就是说,我可以通过该文件中的处理程序在按下按钮时调用您的函数。不过,我也可以在计时器事件中通过编程从指示器主体设置按钮状态。但这样我就不需要按下按钮了。总之,有不同的元素。其中一些可以在指示器主体内部处理(主要是非交互式元素,例如进度条),还有一些在文件Internal_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 控件 的处理程序,专门用于连接控件

该文件是为用户设计的,不属于引擎或我的任何其他代码。

我明白了,彼得。
当然,这对开发人员来说并不方便。不过,带有函数指针的变体要好得多。