程序库: Easy Canvas - 页 4

 
超级棒方便易懂。
 

我建议添加鼠标按钮状态。这不会影响速度,但会很有用 )


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);
  }
 
Oleksii Chepurnyi:

我建议添加鼠标按钮状态。这不会影响速度,但会很有用 )

我不同意,因为我觉得这样做没什么意义。

问题的关键在于,鼠标按钮和按键的状态是一个事件模型,只应在捕捉到该事件发生的地方(即 OnChartEvent)进行处理。
您不可能在事件处理程序之外无限循环地轮询某个事件的发生。因此,如果这些点击的所有处理都应在 OnChartEvent 中完成,而其状态应在 lparam 和 sparam 中,那么将此状态放在 OnChartEvent 之外又有什么意义呢?

除了引入新的鼠标事件标识符结构以提高 代码的可读性 之外。

 
Nikolai Semko:

我不能同意,因为我觉得这样做没什么意义。

问题的关键在于,鼠标按钮和按键的状态是一个事件模型,只能在捕捉到该事件发生的地方(即 OnChartEvent)进行处理。
您不可能在事件处理程序之外无限循环地轮询某个事件的发生。因此,如果这些点击的所有处理都应在 OnChartEvent 中完成,而其状态应在 lparam 和 sparam 中,那么将此状态放在 OnChartEvent 之外又有什么意义呢?

除了引入新的鼠标事件标识符结构以提高 代码的可读性 之外。

那为什么还要存储鼠标坐标呢?) 也是事件驱动 )

我不明白循环的意思...

特别是,我需要状态来避免在用鼠标拖动时绘制对象的一部分。

 
Oleksii Chepurnyi:

那为什么要存储鼠标坐标?) 也是事件驱动 )

鼠标坐标是另一回事。当前鼠标坐标不是事件信息。事件是它们的变化。

有时可能需要在 OnChartEvent 之外使用鼠标坐标。例如,这里

Oleksii Chepurnyi

我不明白循环的意思...

特别是在用鼠标拖动时,为了避免绘制对象的一部分,需要使用状态。

拖动鼠标时,重新绘制部分对象的命令是在鼠标坐标发生变化和按下鼠标时从 OnChartEvent 中调用的,而 OnChartEvent 具有这种状态,为什么要将其嵌入窗口结构中呢?

如果不在 OnChartEvent 中做同样的事情,而同时在Window 结构的实例 W 中又有 MouseStatus,那么就必须对该参数(MouseStatus)进行无休止的循环轮询,以捕捉释放鼠标按钮的时刻,这样就会挂起 CPU。

这种循环并非只有在 OnChartEvent 中才有必要。

我只想说,您可以也应该只在 OnChartEvent 中使用已存在的按钮状态。

如果我说错了,请给我一个 需要在 OnChartEvent 中使用该状态的具体示例。


 
Nikolai Semko:

如果我说错了,请提供一个具体的示例,说明除了 OnChartEvent之外,还可以从其他什么地方要求这种状态。

我在上面写了一个示例,一切正常 )

OnChartEvent 中,当鼠标移动时,我们会更改参数并发出重绘画布的命令。如果结构中没有参数,我们就必须将 sparam 传递给一个对象,再从该对象传递给另一个对象,然后再传递给 Draw() 方法。

 
Nikolai Semko:

鼠标坐标则是另一回事。当前鼠标坐标不是事件信息。事件是它们的变化。

有时可能需要在 OnChartEvent 之外使用鼠标坐标。例如,这里

拖动鼠标时,重绘对象一部分的命令是在鼠标坐标发生变化和按下鼠标按钮时从 OnChartEvent 调用的,而 OnChartEvent 具有这种状态,为什么要将其嵌入 Window 结构中呢?

如果不在 OnChartEvent 中做同样的事情,而同时在Window 结构的实例 W 中又有 MouseStatus,那么就必须对该参数(MouseStatus)进行无休止的循环轮询,以捕捉释放鼠标按钮的时刻,这样就会挂起 CPU。

只有在 OnChartEvent 中才不需要这个循环。

我只想说,您可以也应该只在 OnChartEvent 中使用按钮状态,因为它已经有了按钮状态。

如果我说错了,请给我一个 需要在 OnChartEvent 中使用按钮状态的具体例子。


非常奇怪的推理。完全没有逻辑可言。

鼠标坐标和按键都是外部状态。它是通过参数传递给处理程序的,如果把它放到对象的内部变量中(这当然是有用的),它就应该是一个整体,而不是部分。从定义上讲,库并不是为了满足自己的需求而建立的,而是在考虑到他人潜在需求的基础上,以一种通用的形式建立的。你不可能事先知道所有的需求,所以你不能像这样人为地加以限制。

 
Oleksii Chepurnyi:

我在上面写了一个例子,一切正常 )

在 OnChartEvent 中,当鼠标移动时,我们会更改参数并发出重绘画布的命令。如果结构中没有参数,我们就必须将 sparam 传递给一个对象,再从该对象传递给另一个对象,然后再传递给 Draw() 方法。

在所有窗口库中,鼠标按钮的状态都是与光标坐标一起在一个结构中传递的。

,因为它们共同描述的是一个实体,根本无法分开。

 
好的你能行的
 

更新至版本 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)