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

 

结果正常工作,但在输入框中输入数值时,警告窗口出现时不会重置输入的数值(需要改进)。

(另外 更新中添加了框架颜色设置,但当前版本中没有)。


 

下一项任务是考虑按 "取消 "按钮取消输入的参数。

这是一项非常艰巨的任务,但我已经部分实现了。我将尝试恢复以前的功能。

 
除了颜色指示外,我现在还在实现框架、文本和底座的闪烁。我想明天就可以完成了。接下来是用取消按钮取消输入的数值。

问题在于,在元素中输入数值后,内核会立即接收并将其传递到 API 文件,这在逻辑上会导致自定义代码的处理。因此有必要在带确认按钮的窗口中延迟接受数值,然后再将其输入参数,并将其与点击 "确定 "或 "确认"(或 "应用")联系起来。

但同时,如果用户点击取消按钮(Cancel),也有必要将更改前的值返回到元素中。

这是一个非常有趣的问题,它的解决会立即将界面的实用性提升到一个新的水平。幸运的是,在大多数情况下,这个目标早已实现。令人惊讶的是,4 年前就已经实现了很多有趣的东西。

我想我会在一周内完成任务,然后再认真对待表格。
 

在上一个故障中,我展示了如何应用彩色风险指示,以及如何在超过设定参数限值时打开阻止窗口。然而,我发现了两个意想不到的问题。

1.风险管理功能会在越过危险值时打开第一个警告窗口,但如果此时一直将光标按在元素上,该值会继续增长并达到下一个条件值。- 危急。

2.越过临界值后,最后一个警告窗口会打开,但如果用户继续按住鼠标左键,也不会阻止数值变化。

3. 如果用户松开鼠标左键,并想关闭警告窗口,但却做不到。更准确地说,是无法关闭。原因是两个阻止窗口开始相互阻止。当其中一个阻止窗口打开时,它很容易被关闭,但当两个窗口同时打开时,界面上的其他任何东西都无法工作。虽然程序仍能运行,但却陷入了停滞状态。

下图显示了这种情况的发生过程:

 

然后,我修复了设置窗口的相互锁定问题,现在这些窗口不会相互干扰了。它们一起执行锁定功能,不会相互冲突。


现在,我需要让警告窗口自动停止更改参数值,即使按下鼠标左键且项目处于活动状态也是如此。

 
今天我将继续发表关于参数值的颜色指示--元素闪烁的文章。这项任务比我想象的要复杂一些,所以我迟迟没有动手。最终,解决方案证明所花时间是值得的。在我看来,无论如何都是值得的。
 
这你们也能看懂
 
Jin Rong Xia #:
你能理解的。
是的,我能听懂翻译器很好用
 

主题 14.3:通过元件(框架、底座、文本、滑块和滑块板)的闪烁显示危险值。

元素闪烁是对颜色指示的一个很好的补充,表示参数进入危险值区域。新方案的实施与之前的方案类似,但如果颜色指示的工作原理是数值越接近临界值,颜色就越亮,那么闪烁只会增加初始颜色与为闪烁设置的颜色之间的变化频率。用户可以通过编程调整闪烁延迟时间,逐渐缩短至 25 毫秒或延长至 2.5 秒。在这种情况下,两种机制可以同时运行。颜色会从浅绿色变为鲜红色和酒红色,闪烁速度也会加快。一个装置不会干扰第二个装置。接下来,我们将举例说明。

*重要提示: 闪烁的激活与颜色指示功能无关。 这两种机制在技术上并无关联,可以并行工作,也可以分开工作。

为实现闪烁功能,交互式元素添加了新的属性:

  • pn_BLINK_frame-. 框架闪烁 已添加到所有具有框架的控件中。以下元素除外:H_SLIDER、V_SLIDER、VALUE、R_BUTTON CHECKBOX
  • pn_ BLINK_text - 闪烁文本闪烁文本 添加到所有具有文本的元素。不包括以下元素:p_bar、d_bar、 h_slider v_slider。
  • pn_BLINK_base 闪烁底座 添加到所有有底座的元素。不包括以下元素:CHECKBOX、R_BUTTON、D_LIST、C_LIST、VALUE。
  • pn_BLINK_bar -闪烁 条形图 添加到带有条形图的项目: P_BAR 、D_BAR、H_SLIDER V_SLIDER。
  • pn_BLINK_handle - 闪烁滑块。 已添加至H_SLIDER、V_SLIDER 滑块�


新增了控制闪烁速度和停止的属性:

  • pn_BLINK_DELAY - 闪烁延迟。 已无一例外地添加到所有主元素中。*重要 提示--延迟时间是为元素的所有闪烁部分设置的,不同部分之间不能有差异。 元素的所有部分在软件启用闪烁功能后(可以有多个部分)都将同步闪烁。不过,元件之间的闪烁速度可能不同,这完全由用户自行决定。
  • pn_BLINK_STOP 完全 停止元件所有部件闪烁的命令
  • 在当前阶段,可以启用设置窗口框架的闪烁。为此,您需要调用窗口函数,并将pn_BLINK_frame 属性的标识符传递给它 还有颜色。一切都与元素完全相同。

让我们总结一下上述内容:

  • 闪烁延迟pn_BLINK_DELAY 是通过编程设置的,并同时应用于元素的所有闪烁部分。它们同步闪烁。
  • pn_BLINK_DELAY 属性有一个默认值。除非用户明确指定,否则闪烁延迟将为 20,即刚刚超过一秒(20*25ms)。
  • 一个元素可以同时闪烁多个部分,也可以一次闪烁一个部分。用户可以自行决定。
  • 在闪烁过程中,可以通过编程改变颜色和调整速度。下面将讨论闪烁功能。
  • 要使元素的另一部分闪烁,需要调用函数并传递元素部分的标识符和颜色。但是,举例来说,如果一个框架正在闪烁,而用户希望文本以所需的值闪烁,并且框架停止闪烁,则需要使用pn_BLINK_STOP 命令完全关闭闪烁,然后通过程序调用打开文本闪烁。
  • 根据用户的要求,元素的组成部分可以以不同的颜色闪烁。例如,文字可以设置为绿色闪烁,边框可以设置为蓝色闪烁,底座可以设置为红色闪烁。可以有不同的变化。但我要提醒您的是 元素内所有部件的闪烁速度都是一样的。
  • 如果窗口被最小化,而其标签页位于任务栏上,并且窗口中有闪烁的元素,那么标签页将自动选择关闭窗口中闪烁最快的元素(窗口关闭时不会实际重绘),并根据其频率和颜色进行调整。也就是说, 任务栏上的选项卡会按照窗口中闪烁最快的元素的颜色和速度闪烁 但是,如果元素在接收数值时改变了闪烁速度,那么标签页就会自动重建,找到另一个元素并改变其闪烁速度和颜色。
  • 如果窗口中的元素完全停止闪烁,标签页也会自动停止闪烁。

明天我们将继续讨论实际示例。

今天只做一个小演示,以了解我们在说什么。



不幸的是,录制时会有延迟。处理器已加载。但演示显示,元素以不同的速度异步闪烁。元素的不同部分也会闪烁。所有这些都是通过程序设置的。任务栏上的选项卡会自动找到闪烁速度最快的元素,并变成蓝色。然后,当该元素开始减少闪烁频率时,它会找到另一个闪烁最快的元素,并变成红色。

明天我们将更详细地探讨这个问题。

附注:我们还将讨论如何使用这些非常有用的功能。

 


接着昨天的话题...

今天,我们将从概念上总结并完成元素闪烁这一主题。

昨天,我只从危险值信号的角度探讨了闪烁,但其应用范围远不止于此。下面是一个例子:

假设有一个多币种智能交易系统 在分析多个市场的情况。假设它根据一套复杂的标准选择最佳进入/退出点。Expert Advisor 以半自动模式运行,交易者无法或不想对交易策略的整个逻辑进行编程。它的机器人会监控市场、收集数据并告知重要点位。专家的工作仅限于分析并以表格和图表的形式显示结果。交易的最终决定由个人做出。

在这种变体中,交易活动包括观察实时数据流,并将一系列运行值打包成自定义参数。后者有助于提高态势感知能力。

然而,实时参与需要及时做出决策。当分析结果通过多个图形视图显示在不同窗口时,问题就出现了。需要关注的信息量不断增加,关注的焦点也随之分散。因此,交易员的头脑中市场视角变得模糊不清,工作效率降低。疲劳感随之而来。

在这种情况下,闪烁元素会起到很好的帮助作用:

  • 它可以提示做出决定或采取行动的紧迫性。
  • 告知变化的速度。
  • 告知所观察事件的相关性。
  • 告知所获结果的重要性:数字、差异、范围、总和、极限 等。

总而言之:
  • 闪烁可以提醒、警告、通知、信号或指示。
  • 闪烁可以集中注意力,提高交易者的注意力。
  • 频率和颜色决定了决策或行动的紧迫性。
  • 结合颜色变化,闪烁可提高图形用户界面的互动性和交易员的效率。

让我们来具体分析一下新功能:

  • 1.规定准备行动的顺序。
  • 2.2. 在按下按钮时使按钮框闪烁,在取消按下按钮时禁用闪烁。
  • 3.打开按钮文字的闪烁功能。
  • 4.打开按钮底座的闪烁功能。
  • 5.将其他几个元素与按钮的闪烁连接起来:带按钮的字段、滑块、复选框等。
  • 6.触发窗口边框的闪烁。
  • 7.7. 将元素的闪烁速度与滑块和带按钮字段的值连接起来。

//----------------------------------------------------------------------------------------------------------

1.准备工作的顺序

  • 首先,我们要编写Blink_start()Blink_stop() 函数的封装器,在调用这两个函数时,应切换元素闪烁的开和关。
  • Blink_start() 函数将负责开启。它将在按下事件中被调用。Blink_stop() 函数负责关闭闪烁。当按下"启动 " 按钮时,它将被调用
  • 让我们在 API 文件中找到该按钮,并编写按下按钮时Blink_start() 函数的调用和按下按钮Blink_stop() 函数 调用
//-----------------------------------------------------
//This function will start the blinking of the elements.
//-----------------------------------------------------
void Blink_start()
{

}
//-----------------------------------------------------
//This function will stop the blinking of the elements.
//-----------------------------------------------------
void Blink_stop()
{

}


现在,让我们在 API 文件中找到 "Start "按钮的情况,并写出按下和按下按钮时对Blink_start()Blink_stop() 函数的调用:

case Settings_example_1___Start:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when the button is pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:    Blink_start();  break;
  
                case released:   Blink_stop();   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;


下面我们继续为函数填充内容:

1.我们需要 "开始 "按钮的框架闪烁。如下代码所示,我们来编写一个框架闪烁的调用。按钮框架闪烁属性的标识符为 p1_BLINK_frame。 指定闪烁 的颜色和闪烁的对象。

void Blink_start()
{
 //Setting the color and the part of the element that is suppoused to blink.
 w6_i_p1_BUTTON_Start((int)clrLimeGreen,p1_BLINK_frame);
}


2. 现在我们来实现释放按钮时禁用闪烁。标识符p1_BLINK_STOP 负责关闭闪烁 除此以外,无需在括号中添加任何内容。

void Blink_stop()
{
 //Stopping the blinking of all of the parts of the element all together:
 w6_i_p1_BUTTON_Start(p1_BLINK_STOP);
}


让我们检查一下结果:



3.让我们打开按钮文本的闪烁,而不是框架的闪烁。pn_BLINK_text 属性的标识符负责闪烁文本:

void Blink_start()
{
 //Setting the color and the part of the element that is suppoused to blink.
 w6_i_p1_BUTTON_Start((int)clrRed,p1_BLINK_text);
}

结果:按钮文字闪烁蓝色,按下按钮后停止闪烁。



4.4. 打开按钮底座的闪烁功能。pn_BLINK_base 属性的标识符负责底座

void Blink_start()
{
 //Setting the color and the part of the element that is suppoused to blink.
 w6_i_p1_BUTTON_Start((int)clrRed,p1_BLINK_base);
}

结果: 按钮 底座 闪烁红色,按下时停止闪烁。



现在,让我们将按钮边框和文字的闪烁结合起来:

void Blink_start()
{
 //Setting the blinking of the frame and the text of the button
 w_6_Settings_example_1((int)clrRed,p8_BLINK_frame);
 w_6_Settings_example_1((int)clrRed,p8_BLINK_text);
}

结果:按钮边框和按钮文字按照预期同步以不同颜色闪烁。


5.5. 让我们将窗口中的其他元素与闪烁连接起来:

void Blink_start()
{
 //Setting the color and the part of the element that is suppoused to blink.
 //-------------------------------------------------------------
 w6_i_p1_BUTTON_Start((int)clrLimeGreen,p1_BLINK_frame);
 w6_i_p1_BUTTON_Start((int)clrRed,p1_BLINK_text);
 //-------------------------------------------------------------
 w6_d_p5_S_EDIT_Spin_the_value((int)C'255,50,0',p5_BLINK_frame);
 w6_d_p5_S_EDIT_Spin_the_value((int)C'255,50,0',p5_BLINK_text);
 //-------------------------------------------------------------
 w6_i_p3_H_SLIDER_Roll_the_value((int)C'255,50,0',p3_BLINK_handle);
 w6_i_p3_H_SLIDER_Roll_the_value((int)C'255,50,0',p3_BLINK_bar);
 //-------------------------------------------------------------
 w6_i_p7_CHECKBOX_Set_an_option((int)C'255,50,0',p7_BLINK_text);
 //-------------------------------------------------------------
 w6_s_p6_D_LIST_D_LIST_1((int)C'255,50,0',p6_BLINK_frame);
 //-------------------------------------------------------------
}

我们还可以在 Blink_stop( ) 函数中写入禁用闪烁的功能

void Blink_stop()
{
 //Stopping the blinking
 //-------------------------------------------------------------
 w6_i_p1_BUTTON_Start(p1_BLINK_STOP);
 //-------------------------------------------------------------
 w6_d_p5_S_EDIT_Spin_the_value(p5_BLINK_STOP);
 //-------------------------------------------------------------
 w6_i_p3_H_SLIDER_Roll_the_value(p3_BLINK_STOP);
 //-------------------------------------------------------------
 w6_i_p7_CHECKBOX_Set_an_option(p7_BLINK_STOP);
 //-------------------------------------------------------------
 w6_s_p6_D_LIST_D_LIST_1(p6_BLINK_STOP);
 //-------------------------------------------------------------
}

结果:新元素被纳入 Blink_start() 和 Blink_stop()函数,并按预期闪烁。


6.6. 点击按钮时,让窗口边框闪烁。(暂时禁用滞后元素的闪烁)。

void Blink_start()
{
//Setting the blinking of the frame of the window:
 w_6_Settings_example_1((int)clrRed,p8_BLINK_frame);
}
void Blink_stop()
{
//Stopping the blinking of the frame of the window:
 w_6_Settings_example_1(p8_BLINK_STOP);
}


结果:窗口边框闪烁如常。


*重要提示:所有被考虑的元素和窗口边框都以默认速度闪烁。

我们将进一步调节带滑块手柄的元素和带按钮的区域的闪烁速度。


7.7. 将闪烁速度与按钮和滑块字段中的值绑定。所有元素和窗口边框将同时闪烁,闪烁速度将由这些元素手动设置。

请注意,闪烁速度取决于pn_BLINK_DELAY 延迟

  • 延迟时间最小为 1,最大为 99。
  • 要计算闪烁延迟时间,需要将其值乘以 25(毫秒)。
  • 默认情况下,延迟时间等于 20,即 500 毫秒(20*25ms)。

为了解决这个问题,让我们执行以下操作:

  • 1.1. 恢复所有元素在按下/释放按钮时的闪烁,并添加呼叫/停止窗口的闪烁。
  • 2.2. 编写一个新函数 Blink_delay(),我们将在其中调用暂停闪烁的功能。该函数将接受延迟值。
  • 3.3. 让我们从 API 文件中的滑块元素和输入框中 调用Blink_delay() 函数,并传递当前值。

我们在 Blink_start() 函数中添加了窗口边框闪烁功能 .

void Blink_start()
{
 //Setting the color and the part of the element that is suppoused to blink.
 //-------------------------------------------------------------
 w_6_Settings_example_1((int)clrRed,p8_BLINK_frame);
 //-------------------------------------------------------------
 w6_i_p1_BUTTON_Start((int)clrLimeGreen,p1_BLINK_frame);
 w6_i_p1_BUTTON_Start((int)clrRed,p1_BLINK_text);
 //-------------------------------------------------------------
 w6_d_p5_S_EDIT_Spin_the_value((int)C'255,50,0',p5_BLINK_frame);
 w6_d_p5_S_EDIT_Spin_the_value((int)C'255,50,0',p5_BLINK_text);
 //-------------------------------------------------------------
 w6_i_p3_H_SLIDER_Roll_the_value((int)C'255,50,0',p3_BLINK_handle);
 w6_i_p3_H_SLIDER_Roll_the_value((int)C'255,50,0',p3_BLINK_bar);
 //-------------------------------------------------------------
 w6_i_p7_CHECKBOX_Set_an_option((int)C'255,50,0',p7_BLINK_text);
 //-------------------------------------------------------------
 w6_s_p6_D_LIST_D_LIST_1((int)C'255,50,0',p6_BLINK_frame);
 //-------------------------------------------------------------
}

我们在Blink_stop() 函数中添加了禁用窗口边框闪烁的功能

void Blink_stop()
{
 //Stopping the blinking
 //-------------------------------------------------------------
 w_6_Settings_example_1(p8_BLINK_STOP);
 //-------------------------------------------------------------
 w6_i_p1_BUTTON_Start(p1_BLINK_STOP);
 //-------------------------------------------------------------
 w6_d_p5_S_EDIT_Spin_the_value(p5_BLINK_STOP);
 //-------------------------------------------------------------
 w6_i_p3_H_SLIDER_Roll_the_value(p3_BLINK_STOP);
 //-------------------------------------------------------------
 w6_i_p7_CHECKBOX_Set_an_option(p7_BLINK_STOP);
 //-------------------------------------------------------------
 w6_s_p6_D_LIST_D_LIST_1(p6_BLINK_STOP);
 //-------------------------------------------------------------
}

编写Blink_delay() 函数:

在滑块和输入框元素事件中 调用Blink_delay()函数,并将元素的当前值传递给它:

void Blink_delay(uint delay)
{
 if(delay > 0 && delay < 100)
   {
    //-------------------------------------------------------------
    w_6_Settings_example_1(delay,p8_BLINK_DELAY);
    //-------------------------------------------------------------
    w6_i_p1_BUTTON_Start(delay,p1_BLINK_DELAY);
    //-------------------------------------------------------------
    w6_d_p5_S_EDIT_Spin_the_value(delay,p5_BLINK_DELAY);
    //-------------------------------------------------------------
    w6_i_p3_H_SLIDER_Roll_the_value(delay,p3_BLINK_DELAY);
    //-------------------------------------------------------------
   }
else Print("Wrong value!");
}

*重要提示:事实证明,无法更改复选框和下拉列表元素的闪烁速度。该速度始终等于 20(半秒)。这是有意为之,但我可能会在将来修改。其他元素可以改变闪烁速度。

让我们从 "Spin_the_value "元素(带按钮的字段)的事件中 调用Blink_delay() 函数。该字段与滑块相连,因此无需在滑块中进行调用。连接将起作用,不直接调用的滑块将通过带按钮的字段改变闪烁速度:

case Settings_example_1___Spin_the_value:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when the value is set?
               //------------------------------------------------------------------------------------------------------
               //Min value:  NOT SET  |   Max value:  NOT SET  |   V_step:  1.7  |   Default value:  468.99  |  Digits: 3
               //------------------------------------------------------------------------------------------------------
               w6_i_p3_H_SLIDER_Roll_the_value((int)value);
              
               //Сalling the blinking delay function
               Blink_delay((int)value);
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;


结果:带按钮的字段和滑块改变窗口中元素的闪烁速度。



结果:

  • 通过实现元素闪烁,界面的交互性和信息量比以前大大增加。
  • 启用、控制和禁用元素闪烁的方法非常简单,在本页的两篇文章中有详细介绍。
  • 我们列出了这些方法,并通过代码示例和视频进行了演示。
  • 也许将来还可以改进或添加一些细微差别,但总的来说,基本的闪烁功能已经添加,不需要做大的改动。
  • 您可以在改变元素参数值的同时改变闪烁的颜色。

我认为这一主题已经完成。


下一个问题是按下 "取消 "按钮取消输入值。