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

 
Nikolai Semko #:

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

为什么不方便?您试试看就知道了。)

1.构造函数会自行打印所有元素处理程序,只需将它们连接起来即可。

2. Intellisense 提供了必要的函数,只需选择即可。)

3.所有规则都很简单,不难记忆。

只有可视化编辑器可以更简单,但这是后话。

附注:在休息了 4 年之后,我在 10 分钟内完成了您的任务。剩下的时间我一直在想为什么你的函数不起作用,然后我就在拍 gif。)))
 
Реter Konow #:
为什么会不舒服?你试一试就会得出结论))

1.所有元素处理程序都由构造函数自行打印,只需将它们插入即可。

2.Intellisense 提供了必要的函数,只需选择一个即可。)

3.所有规则都很简单,易于记忆。


只有可视化编辑器可以更简单,但这是后话。

附注:在休息了 4 年之后,我在 10 分钟内完成了你的任务。剩下的时间我一直在想为什么你的功能不起作用,然后拍摄了 gif。)))

我发现开发人员需要编写的 Internal_API.mqh 文件相当庞大和复杂



在这样一个只有一个按钮的任务中,会有多少行代码呢? 对于开发人员来说,以创建对象的常规方式开发图形用户界面是非常重要的。 例如,我的任务如下:

#resource "//Images//eclipse-alt.png" as uchar eclipse_alt[] // загружаем в ресурс изображение иконки с файла png
#include  <My\IconsMenu.mqh>

//+------------------------------------------------------------------+
IconsMenu menu(5,15,1,ANCHOR_RIGHT_UPPER,true,27, CheckBox, 0x00EEEEEE); // создаем меню
//+------------------------------------------------------------------+
void TimerMenu() { // таймер необходим для всплывающей подсказки
   menu.Timer();
}
//+------------------------------------------------------------------+
int OnInit() {
   InitMenu();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}
//+------------------------------------------------------------------+
void OnTick() {
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   menu.ChartEvent(id,lparam,dparam,sparam);
}
//+------------------------------------------------------------------+
void InitMenu() {
   menu.SetTimerFunction(TimerMenu); // установка функции таймера
   bool dark_mode = W.Color!=0;      // определяем текущую цветовую схему чарта
   menu.AddPng(eclipse_alt,"dark/light theme",ChangeColorScheme,dark_mode); // создаем элемент кнопки-иконки
   menu.Draw();
}
//+------------------------------------------------------------------+
void ChangeColorScheme (bool checked) {
   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}
   };
   int clr_scheme = checked?1:0;

   if (checked) {
      menu.clr_off = 0x00606060;
      menu.clr_hover = 0x30808080;
   } else {
      menu.clr_off = 0x00EEEEEE;
      menu.clr_hover = 0x30FFFFFF;
   }
   menu.ChangeColorAll();
   menu.Draw();

   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();
}

与创建和自定义图形用户界面有关的所有内容都用黄色标出。每个新的图形用户界面元素都是一行代码+该元素的事件处理函数。



附加的文件:
 
尼古拉,我已经解释过了。

1.保存已构建的图形用户界面时,文件会自动打印出来。

2.没有人专门写它。

3.文件中包含用户在标记语言中声明的控件 的处理程序。

4..处理程序从引擎接收界面事件。

5.5. 用户只需在处理程序中插入自己的代码。

就是这样。抱歉,我不再重复了。

 
Реter Konow 控件 的处理程序。

4..处理程序从引擎接收界面事件。

5.用户只需在处理程序中插入代码。

就是这样。抱歉,我不再重复了。



好吧,你没有提供这个文件,所以我才做了假设。 我们会等待包含所有文件的版本,这样我们就可以进行实时测试了。

 
关于多少行代码的问题。

在解决你的问题时,我在处理程序中插入了两行 intellisense 代码。如图所示。我只在括号中写了颜色的名称。还有两行函数(而不是你的函数)。没有其他内容。
 
我正在发布前 "清理 "代码,"重建 "引擎,删除不必要的东西(如果能找到的话),同时记住所有东西是如何工作的。

总的来说,我会尽快发布。
 
Реter Konow # :
我正在发布前 "清理 "代码,"重建 "引擎,删除不必要的东西(如果能找到的话),同时记住所有东西是如何工作的。

总的来说,我会尽快发布。

期待您的发布,我想了解您的编码理念。

 
Nikolai Semko # :

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


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

毕竟,图形用户界面不是一个独立的程序。图形用户界面最终必须与开发人员的主程序交互。无论是指标还是 EA。

您在图片中展示的图形用户界面非常棒,能告诉我们您是如何实现的吗?

 
hini #:

期待您的发布,希望了解您的编码理念。

好的。

关于这次发布,我稍作说明。经过 4 年的中断,最新版本的引擎丢失了。这并没有马上被发现。旧版本还能用,但需要升级到生成器版本。为此,我必须深入研究代码,而我已经忘记了一些代码。不过,这不是什么大问题,很快就能完成。

由于引擎的延迟,我决定这次发布将分为两个部分。首先,我将展示构造器。有兴趣的人可以熟悉标记语言并编写必要的图形用户界面。一段时间后,我将向公众提供更新后的引擎。之后,我将帮助大家将创建的图形用户界面连接起来,并与自定义的智能交易系统或指标一起工作。然后,每个人都将学习使用标记语言的简单工作原理以及将界面连接到其应用程序的方法。

分两部分发布比较简单,因为构造函数已基本准备就绪,只需对引擎稍作修改即可发布。

当然,在发布构造函数的同时,我还会提供标记代码示例和其他编写说明。

敬请期待周末)。
 
我想补充说明一下:在设计器发布之后,那些想直接从 ME 中即时设计图形用户界面的人可以这样做

1.为此,他们将打开发布版中的 "KIB-source.mqh "包含文件。

2.2. 将其保存在指标文件夹中,然后进行编译。

3.3. 因此,他们将在 MT5 导航器分支中看到一个名为 "KIB-source.ex5 "的新指标,并将其添加到自由图表中。

4.用户将在 MQL5 navigator\include\...文件夹中创建带有标记代码的文件。

例如,MQL5\include\My_GUI\Project_1\.....

在这个文件夹中,他将存储 项目界面的文件。他还将在其中编写、编辑、实验和设计标记代码的用户界面。

5.必须说明的是,在使用标记语言构建用户界面时,结果将显示在 MT5 图表上,其中包括指标 "KIB-source.ex5 "和智能交易系统(构造器)"KIB.ex5",我将在第一个版本中提供这两个工具。它们应在同一图表上。

此外(非常重要的是),在编译 ME 中并行打开的 "KIB-source.mq5 "文件(以及自定义图形用户界面项目的文件)时,所有标记代码都会发送到同一图表上的构造函数,并完全重新构建图形用户界面。所需的时间从 200ms 到 1000ms 不等,这取决于界面中窗口和元素的数量。用户可以立即看到所做更改的结果。一切都发生得非常快,几乎是实时的--您对标记代码进行修改,编译 "KIB-source.mq5",一瞬间您就能在 MT5 图表上看到结果。因此,最好在两个显示器上工作。一台打开 MT5,另一台打开 ME。

6.标记语言的方便之处在于它的简单性以及创建元素和窗口模板的能力,这些模板可以在窗口或项目之间轻松复制。

7.我想补充的是,设计器在存档中是开源的。因此,用户需要完成以下任务:

打开压缩包。
2.将 KIB 文件夹放入 MQL5\include\ 文件夹中。
3.将存档中的 CONNECTION.mqh 文件放到 MQL5\inlude\ 文件夹中(不要放到子文件夹中)。
4.将 KIB.mq5 文件放入 MQL5\Experts\ 文件夹,在 ME 中打开它,编译并保存,这样 KIB.ex5 Expert Advisor 就会出现在 MT5 导航器中。
5.将此智能交易系统上传到与指标 KIB-source.mq5 相同的图表中。
6.之后,ME 中的 KIB.mq5 构造函数文件即可关闭。不再需要它。


一切准备就绪,即可运行。