程序库: Easy Canvas - 页 4 1234567891011...19 新评论 x68499 2019.12.07 18:41 #31 超级棒方便易懂。 Oleksii Chepurnyi 2019.12.13 14:39 #32 我建议添加鼠标按钮状态。这不会影响速度,但会很有用 ) struct Window { long ChartId; // 当前窗口标识符 uint Color; // 窗口背景颜色 int Width; // 窗口宽度 int Height; // 窗口高度 int height[]; // 子窗口高度 int Left_bar; // 窗口最左栏的编号 double Right_bar; // 窗口中最右边栏的编号 double Total_bars; // 窗口中条形图的最大数量 int BarsInWind; // 窗口中可见条数 double Y_min; // 窗口中价格的最小值 double Y_max; // 窗口中价格的最大值 double dy_pix; // 一个像素的价格变化 int dx_pix; // 改变每个像素的条数 int MouseX; // 鼠标指针当前位置的 X 坐标 int MouseY; // 鼠标指针当前位置的 Y 坐标 int MouseStatus; // 鼠标按钮状态 double MouseBar; // 当前条形图的鼠标指针位置 double MousePrice; // 鼠标指针的当前价格 datetime MouseTime; // 鼠标指针的当前时间 int MouseSubWin; // 鼠标指针所在子窗口的编号 int WindowsTotal;// 包括主窗口在内的所有子窗口 int SubWin; // 当前子窗口 datetime time[]; // 窗口中所有可见条形图的打开时间数组 }; void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { if(id==CHARTEVENT_MOUSE_MOVE) { W.MouseX=(int)lparam; W.MouseY=(int)dparam; W.MouseStatus=(int)sparam; W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/(double)W.dx_pix; W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id); if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2; } if(id==CHARTEVENT_CHART_CHANGE) ChartChanged(); if(OnZ) SetOnChart(sizeArr); if(OnChart) MyChartEvent(id,lparam,dparam,sparam); } Nikolai Semko 2019.12.16 18:51 #33 Oleksii Chepurnyi:我建议添加鼠标按钮状态。这不会影响速度,但会很有用 ) 我不同意,因为我觉得这样做没什么意义。 问题的关键在于,鼠标按钮和按键的状态是一个事件模型,只应在捕捉到该事件发生的地方(即 OnChartEvent)进行处理。 您不可能在事件处理程序之外无限循环地轮询某个事件的发生。因此,如果这些点击的所有处理都应在 OnChartEvent 中完成,而其状态应在 lparam 和 sparam 中,那么将此状态放在 OnChartEvent 之外又有什么意义呢? 除了引入新的鼠标事件标识符结构以提高 代码的可读性 之外。 Oleksii Chepurnyi 2019.12.16 19:58 #34 Nikolai Semko:我不能同意,因为我觉得这样做没什么意义。问题的关键在于,鼠标按钮和按键的状态是一个事件模型,只能在捕捉到该事件发生的地方(即 OnChartEvent)进行处理。 您不可能在事件处理程序之外无限循环地轮询某个事件的发生。因此,如果这些点击的所有处理都应在 OnChartEvent 中完成,而其状态应在 lparam 和 sparam 中,那么将此状态放在 OnChartEvent 之外又有什么意义呢? 除了引入新的鼠标事件标识符结构以提高 代码的可读性 之外。 那为什么还要存储鼠标坐标呢?) 也是事件驱动 ) 我不明白循环的意思... 特别是,我需要状态来避免在用鼠标拖动时绘制对象的一部分。 Nikolai Semko 2019.12.16 21:26 #35 Oleksii Chepurnyi:那为什么要存储鼠标坐标?) 也是事件驱动 ) 鼠标坐标是另一回事。当前鼠标坐标不是事件信息。事件是它们的变化。 有时可能需要在 OnChartEvent 之外使用鼠标坐标。例如,这里 Oleksii Chepurnyi: 我不明白循环的意思...特别是在用鼠标拖动时,为了避免绘制对象的一部分,需要使用状态。 拖动鼠标时,重新绘制部分对象的命令是在鼠标坐标发生变化和按下鼠标时从 OnChartEvent 中调用的,而 OnChartEvent 具有这种状态,为什么要将其嵌入窗口结构中呢? 如果不在 OnChartEvent 中做同样的事情,而同时在Window 结构的实例 W 中又有 MouseStatus,那么就必须对该参数(MouseStatus)进行无休止的循环轮询,以捕捉释放鼠标按钮的时刻,这样就会挂起 CPU。 这种循环并非只有在 OnChartEvent 中才有必要。 我只想说,您可以也应该只在 OnChartEvent 中使用已存在的按钮状态。 如果我说错了,请给我一个不 需要在 OnChartEvent 中使用该状态的具体示例。 Oleksii Chepurnyi 2019.12.16 22:17 #36 Nikolai Semko:如果我说错了,请提供一个具体的示例,说明除了 OnChartEvent之外,还可以从其他什么地方要求这种状态。 我在上面写了一个示例,一切正常 ) 在OnChartEvent 中,当鼠标移动时,我们会更改参数并发出重绘画布的命令。如果结构中没有参数,我们就必须将 sparam 传递给一个对象,再从该对象传递给另一个对象,然后再传递给 Draw() 方法。 Stanislav Korotky 2019.12.16 23:35 #37 Nikolai Semko:鼠标坐标则是另一回事。当前鼠标坐标不是事件信息。事件是它们的变化。有时可能需要在 OnChartEvent 之外使用鼠标坐标。例如,这里拖动鼠标时,重绘对象一部分的命令是在鼠标坐标发生变化和按下鼠标按钮时从 OnChartEvent 调用的,而 OnChartEvent 具有这种状态,为什么要将其嵌入 Window 结构中呢?如果不在 OnChartEvent 中做同样的事情,而同时在Window 结构的实例 W 中又有 MouseStatus,那么就必须对该参数(MouseStatus)进行无休止的循环轮询,以捕捉释放鼠标按钮的时刻,这样就会挂起 CPU。只有在 OnChartEvent 中才不需要这个循环。我只想说,您可以也应该只在 OnChartEvent 中使用按钮状态,因为它已经有了按钮状态。 如果我说错了,请给我一个不 需要在 OnChartEvent 中使用按钮状态的具体例子。 非常奇怪的推理。完全没有逻辑可言。 鼠标坐标和按键都是外部状态。它是通过参数传递给处理程序的,如果把它放到对象的内部变量中(这当然是有用的),它就应该是一个整体,而不是部分。从定义上讲,库并不是为了满足自己的需求而建立的,而是在考虑到他人潜在需求的基础上,以一种通用的形式建立的。你不可能事先知道所有的需求,所以你不能像这样人为地加以限制。 Maxim Kuznetsov 2019.12.16 23:36 #38 Oleksii Chepurnyi:我在上面写了一个例子,一切正常 )在 OnChartEvent 中,当鼠标移动时,我们会更改参数并发出重绘画布的命令。如果结构中没有参数,我们就必须将 sparam 传递给一个对象,再从该对象传递给另一个对象,然后再传递给 Draw() 方法。 在所有窗口库中,鼠标按钮的状态都是与光标坐标一起在一个结构中传递的。,因为它们共同描述的是一个实体,根本无法分开。 Nikolai Semko 2019.12.17 06:04 #39 好的你能行的 Nikolai Semko 2019.12.26 06:43 #40 更新至版本 1.29 新内容 1. 添加了以下定义,以简化代码编写并提高可读性: #define _Comment Canvas.Comm #define _X Canvas.X #define _Y Canvas.Y #define _TimePos Canvas.TimePos #define _Bar Canvas.Bar #define _Price Canvas.Price #define _CommXY(x,y,str) Canvas.TextPosition(x,y);\ Canvas.Comm(str); #define _Font Canvas.CurentFont #define _PixelSet Canvas.PixelSet #define _MouseX W.MouseX #define _MouseY W.MouseY #define _MouseBar W.MouseBar #define _Width W.Width #define _Height W.Height #define _Left_bar W.Left_bar #define _Right_bar W.Right_bar #define _BarsInWind W.BarsInWind 2. 在 Window 结构中添加了 MouseStatus 参数,根据工作人员的要求,该参数可取 4 个值: NO_PRESSED (0) 左按钮按下 (1) 右键按下 (2) 左键和右键按下 (3) 1234567891011...19 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我建议添加鼠标按钮状态。这不会影响速度,但会很有用 )
我建议添加鼠标按钮状态。这不会影响速度,但会很有用 )
我不同意,因为我觉得这样做没什么意义。
问题的关键在于,鼠标按钮和按键的状态是一个事件模型,只应在捕捉到该事件发生的地方(即 OnChartEvent)进行处理。
您不可能在事件处理程序之外无限循环地轮询某个事件的发生。因此,如果这些点击的所有处理都应在 OnChartEvent 中完成,而其状态应在 lparam 和 sparam 中,那么将此状态放在 OnChartEvent 之外又有什么意义呢?
除了引入新的鼠标事件标识符结构以提高 代码的可读性 之外。
我不能同意,因为我觉得这样做没什么意义。
问题的关键在于,鼠标按钮和按键的状态是一个事件模型,只能在捕捉到该事件发生的地方(即 OnChartEvent)进行处理。
您不可能在事件处理程序之外无限循环地轮询某个事件的发生。因此,如果这些点击的所有处理都应在 OnChartEvent 中完成,而其状态应在 lparam 和 sparam 中,那么将此状态放在 OnChartEvent 之外又有什么意义呢?
除了引入新的鼠标事件标识符结构以提高 代码的可读性 之外。
那为什么还要存储鼠标坐标呢?) 也是事件驱动 )
我不明白循环的意思...
特别是,我需要状态来避免在用鼠标拖动时绘制对象的一部分。
那为什么要存储鼠标坐标?) 也是事件驱动 )
鼠标坐标是另一回事。当前鼠标坐标不是事件信息。事件是它们的变化。
有时可能需要在 OnChartEvent 之外使用鼠标坐标。例如,这里
我不明白循环的意思...
特别是在用鼠标拖动时,为了避免绘制对象的一部分,需要使用状态。
拖动鼠标时,重新绘制部分对象的命令是在鼠标坐标发生变化和按下鼠标时从 OnChartEvent 中调用的,而 OnChartEvent 具有这种状态,为什么要将其嵌入窗口结构中呢?
如果不在 OnChartEvent 中做同样的事情,而同时在Window 结构的实例 W 中又有 MouseStatus,那么就必须对该参数(MouseStatus)进行无休止的循环轮询,以捕捉释放鼠标按钮的时刻,这样就会挂起 CPU。
这种循环并非只有在 OnChartEvent 中才有必要。
我只想说,您可以也应该只在 OnChartEvent 中使用已存在的按钮状态。
如果我说错了,请给我一个不 需要在 OnChartEvent 中使用该状态的具体示例。
如果我说错了,请提供一个具体的示例,说明除了 OnChartEvent之外,还可以从其他什么地方要求这种状态。
我在上面写了一个示例,一切正常 )
在OnChartEvent 中,当鼠标移动时,我们会更改参数并发出重绘画布的命令。如果结构中没有参数,我们就必须将 sparam 传递给一个对象,再从该对象传递给另一个对象,然后再传递给 Draw() 方法。
鼠标坐标则是另一回事。当前鼠标坐标不是事件信息。事件是它们的变化。
有时可能需要在 OnChartEvent 之外使用鼠标坐标。例如,这里
拖动鼠标时,重绘对象一部分的命令是在鼠标坐标发生变化和按下鼠标按钮时从 OnChartEvent 调用的,而 OnChartEvent 具有这种状态,为什么要将其嵌入 Window 结构中呢?
如果不在 OnChartEvent 中做同样的事情,而同时在Window 结构的实例 W 中又有 MouseStatus,那么就必须对该参数(MouseStatus)进行无休止的循环轮询,以捕捉释放鼠标按钮的时刻,这样就会挂起 CPU。
只有在 OnChartEvent 中才不需要这个循环。
我只想说,您可以也应该只在 OnChartEvent 中使用按钮状态,因为它已经有了按钮状态。
如果我说错了,请给我一个不 需要在 OnChartEvent 中使用按钮状态的具体例子。
非常奇怪的推理。完全没有逻辑可言。
鼠标坐标和按键都是外部状态。它是通过参数传递给处理程序的,如果把它放到对象的内部变量中(这当然是有用的),它就应该是一个整体,而不是部分。从定义上讲,库并不是为了满足自己的需求而建立的,而是在考虑到他人潜在需求的基础上,以一种通用的形式建立的。你不可能事先知道所有的需求,所以你不能像这样人为地加以限制。
我在上面写了一个例子,一切正常 )
在 OnChartEvent 中,当鼠标移动时,我们会更改参数并发出重绘画布的命令。如果结构中没有参数,我们就必须将 sparam 传递给一个对象,再从该对象传递给另一个对象,然后再传递给 Draw() 方法。
在所有窗口库中,鼠标按钮的状态都是与光标坐标一起在一个结构中传递的。
,因为它们共同描述的是一个实体,根本无法分开。
更新至版本 1.29
新内容
1. 添加了以下定义,以简化代码编写并提高可读性:
2. 在 Window 结构中添加了 MouseStatus 参数,根据工作人员的要求,该参数可取 4 个值: