MetaTrader4贸易专家顾问小组。
如何链接一些OBJ_RECTANGLE_LABEL,以便与另一个对象一起移动?
发布于 2016-10-04 10:04:48
把它们间接连接起来
没有直接支持将几个GUI对象链接到另一个GUI对象。
这并不意味着它不可能像这样工作。
在一个增强的Trader用户界面工具中,我需要所有的GUI组件和一些计算值在一些类似的逻辑下运行(将所有的线条、矩形、文本标签和热图颜色保留在一些常见的UI控制逻辑之下)。所有的实时交互-GUI编排都锁定在几个经过处理的用户机器交互中,在这些交互中,用户能够使用一组UI控件移动--其中一些对象是可以自由修改的,而有些对象则被限制(使用增强现实控制器)仅垂直或水平移动,或者仅仅锁定为从这样一个位置的Bollinger带的边缘开始移动,在这个位置,UI-控件的垂直线被移动,等等。
解决方案很简单:
除了[ Expert Advisor ]创建并运行另一个进程外,负责GUI对象自动化的[ Script ]。在这个脚本中,使用来自对象的一些只读值,比如蓝色的垂直线,作为对GUI组合的输入。
如果有人或某物移动这条蓝色垂直线,脚本中的事件监视循环将检测到SENSOR_x1的一个新值。
和
通过添加刚刚观察到的/检测到的SENSOR_x1_delta = SENSOR_x1 - SENSOR_x1_previous;运动,重新处理所有UI布局方案。
通过这种方式,可以更新SENSOR_* [ Script ]中的运动检测器循环,跟踪所有的实际值,并将检测到的SENSOR_*_delta-s提升到正在GUI布局组合中使用的所有对象上。
最后,在中对增强现实进行重新处理的整个过程中,使用一些强制的WindowRedraw();指令对屏幕进行更新是值得的。
来自PoC演示器的代码

人们可能会注意到,代码采用的是一种新的MQL4.56789前语法,使用的是一些允许的变量命名约定,现在不再允许了。事件监控功能的范围(一个自成体系的函数,在处理MVC框架的所有三个角落(特定于Controller-is的Model-is Live项目、Visual-is Live增强-特定的、灵活的、作为一种有限状态机组成的、主要的构建块中并通过在switch(){}中通过"object.method"调用实现)的最大速度/分钟延迟优化。循环采样率可以大大降低到几十毫秒,因此Live是健壮的,并且在Trader的办公桌上平稳地浮动。
发布于 2016-10-04 13:57:49
这不是最好的方法,但示意性地说明了该做什么。
string mainObjectNAME,
dependantObjectNAME; // dependant - your obj label
void OnChartEvent( const int id,
const long &lparam,
const double &dparam,
const string &sparam
){
if ( id == CHARTEVENT_OBJECT_DRAG
|| id == CHARTEVENT_OBJECT_ENDEDIT
){
if ( StringCompare( sparam, mainObjectNAME ) == 0 ){
datetime time1 = (datetime) ObjectGetInteger( 0, mainObjectNAME, OBJPROP_TIME1 );
double price1 = ObjectGetDouble( 0, dependantObjectNAME, OBJPROP_PRICE1 );
if ( !ObjectMove( 0, dependantObjectNAME, 0, time1, price1 ) )
Print( __LINE__,
"failed to move object ",
dependantObjectNAME
);
}
ChartRedraw();
}
}如果您使用任何公认的方法(通过拖动或传递其他参数)修改mainObject,那么依赖对象(在您的情况下是mainObject)将使用ObjectMove()或ObjectSet()函数进行移动。
https://stackoverflow.com/questions/39838850
复制相似问题