帆布很酷! - 页 28

 
Evgeny Potapov:

谢谢你!这个选项看起来相当现实

谢谢你的问题,因为在回答这个问题时,我意识到我不知道的一个非常重要的事情。
如果有人知道这件事,我会感到惊讶。

如果你使用ObjectSetInteger 调整画布或其位置,你不需要重新绘制它。

  • 即使我们调整了生成的kanvas的大小,然后再把它调整回来,kanvas的数据也会被原画保留。
  • 如果你增加异形画布的大小,数据就会消失,但当你把它的大小调整到原来的大小时,又会重新出现。
  • 当调整大小或改变kanvas的位置时,甚至不需要做Update()或ChartRedraw(),它将随着新的tick或窗口变化而更新。

这个指标表明了这一点。画布只生成一次。但是它的大小和位置可以被改变,而数值的数组被保留。只需在屏幕上移动鼠标

#property indicator_chart_window

#define protected public  // увы, это необходимо, чтобы расширить наши возможности 
#include <Canvas\Canvas.mqh> 
#undef protected
CCanvas C;
int OnInit()
  {
   if(!C.CreateBitmapLabel(0,0,"_Canvas",100,100,600,400,COLOR_FORMAT_ARGB_NORMALIZE))
      Print("Error creating canvas: ",GetLastError());
   DrawCanvas(600,400);
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   C.Destroy();
  }
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])       
  {
    return prev_calculated;               
  }

void OnChartEvent(const int id,          
                  const long& lparam,   
                  const double& dparam, 
                  const string& sparam) 
  {
   if (id==CHARTEVENT_MOUSE_MOVE)  DrawCanvas((int)lparam,(int)dparam);
  }
//+------------------------------------------------------------------+
void DrawCanvas(int x, int y)
{
 static bool first=true;
 //Comment(string(x)+"   " +string(y));
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XDISTANCE,x/5);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YDISTANCE,y/5);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XSIZE,x);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YSIZE,y);  
 if(first) // канвас формируется только один раз
 {
   C.Erase();
   C.FillCircle(100,100,70,ColorToARGB(clrViolet,200));
   C.FillCircle(300,200,100,ColorToARGB(clrLightBlue,100));
   C.Rectangle(140,50,250,150,ColorToARGB(clrAqua));
   C.Update(); 
   first=false;
 }
 ChartRedraw(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
附加的文件:
 
是否可以保存为视频?
 
Andrey Dik:
你能保存为视频吗?
你可以
 
Nikolai Semko:
你可以

酷!希望不是通过创建一百万张图片,然后在一些视频编辑器中把它们组合成一个视频?)

如果你不介意的话,请详细说明一下

 
Andrey Dik:

酷!希望不是通过创建一百万张图片,然后在一些视频编辑器中把它们组合成一个视频?)

如果你不介意的话,请详细说明一下

不,当然不是。
它将。

 
Nikolai Semko:

不,当然不是。
这是个麻烦事。

你不需要代码,给我一个提示怎么做。

 
Nikolai Semko:
  • 当调整画布的大小或改变位置时,你甚至不需要做Update()或ChartRedraw(),它将随着新的刻度或窗口的改变而 被更新。

嗯,终端 根据这些事件 自己调用ChartRedraw();)

 
Andrey Dik:

不需要代码,提示如何做到这一点

有很多选择,这取决于你想拍摄什么样的视频。只是在窗口中实时发生的鼠标指针、指标、对象、GUI ?还是别的什么?

 
这个芯片的真正效用是什么?在价格图上找到有助于交易的模式,是否有帮助?
 
Andrey Khatimlianskii:

嗯,终端 本身在这些事件 上调用ChartRedraw();)

我理解,我只是不想谈细节问题。
我提请你注意,因为chartRedraw()并不重绘画布对象,它只在Update() 期间重绘。如果你使用 ObjectSetInteger来重绘画布对象,那么当ChartRedraw()发生时,强制ChartRedraw()或等待图表的变化或新刻度的到来就足够了。