Gracias por tu pregunta, porque al responderla me he dado cuenta de una cosa muy importante que no sabía. Me sorprendería que alguien lo supiera.
Si cambias el tamaño de un lienzo o su posición usando ObjectSetInteger, no necesitas redibujarlo.
Incluso si redimensionamos el kanvas generado y luego lo volvemos a redimensionar, los datos del kanvas son retenidos por el dibujo original.
Si aumenta el tamaño del kanvas con forma, los datos desaparecerán, pero volverán a aparecer cuando lo redimensione a su tamaño original.
Cuando se redimensiona o se cambia la posición del kanvas ni siquiera es necesario hacer Update() o ChartRedraw(), se actualizará con un nuevo tick o cambio de ventana.
Este indicador lo demuestra. El lienzo se genera una sola vez. Pero su tamaño y ubicación pueden cambiarse, y la matriz de valores se mantiene. Sólo tienes que mover el ratón por la pantalla
#property indicator_chart_window#define protectedpublic// увы, это необходимо, чтобы расширить наши возможности #include <Canvas\Canvas.mqh>
#undef protected
CCanvas C;
intOnInit()
{
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);
}
//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
C.Destroy();
}
//+------------------------------------------------------------------+intOnCalculate (constint rates_total,
constint prev_calculated,
constint begin,
constdouble& price[])
{
return prev_calculated;
}
voidOnChartEvent(constint id,
constlong& lparam,
constdouble& dparam,
conststring& sparam)
{
if (id==CHARTEVENT_MOUSE_MOVE) DrawCanvas((int)lparam,(int)dparam);
}
//+------------------------------------------------------------------+void DrawCanvas(int x, int y)
{
staticbool 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(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
Cuando se redimensiona o cambia la posición del lienzo, ni siquiera es necesario hacer Update() o ChartRedraw(), se actualizará con un nuevo tick o cambio de ventana.
Bueno, el terminal llama a ChartRedraw() por sí mismo según estos eventos ;)
Hay muchas opciones dependiendo del tipo de vídeo que quieras capturar. ¿Qué sucede en la ventana en tiempo real con el puntero del ratón, los indicadores, los objetos, la interfaz gráfica de usuario? ¿O algo más?
Bueno, el propio terminal llama a ChartRedraw() en estos eventos ;)
Lo entiendo, pero no quería entrar en detalles. Te he llamado la atención porque el chartRedraw() no redibuja el objeto canvas, sólo se redibuja duranteUpdate(). Y si se utiliza ObjectSetInteger para redibujar el objeto canvas basta con forzar ChartRedraw() o esperar el cambio de gráfico o la llegada de un nuevo tick, cuando se produce ChartRedraw().
Gracias. Esta opción parece bastante realista.
Gracias por tu pregunta, porque al responderla me he dado cuenta de una cosa muy importante que no sabía.
Me sorprendería que alguien lo supiera.
Si cambias el tamaño de un lienzo o su posición usando ObjectSetInteger, no necesitas redibujarlo.
Este indicador lo demuestra. El lienzo se genera una sola vez. Pero su tamaño y ubicación pueden cambiarse, y la matriz de valores se mantiene. Sólo tienes que mover el ratón por la pantalla
¿se puede guardar en un vídeo?
puedes
Espero que no sea creando un millón de imágenes y luego montándolas en un vídeo en algún editor de vídeo).
si no le importa, por favor, explíquese
Espero que no sea creando un millón de imágenes y luego montándolas en un vídeo en algún editor de vídeo).
si no le importa, por favor, explíquese
No, claro que no.
Lo hará.
No, por supuesto que no.
Es una molestia.
no necesitas el código, dame una pista de cómo hacerlo.
Bueno, el terminal llama a ChartRedraw() por sí mismo según estos eventos ;)
no se necesita código, pista de cómo hacerlo
Hay muchas opciones dependiendo del tipo de vídeo que quieras capturar. ¿Qué sucede en la ventana en tiempo real con el puntero del ratón, los indicadores, los objetos, la interfaz gráfica de usuario? ¿O algo más?
Bueno, el propio terminal llama a ChartRedraw() en estos eventos ;)
Lo entiendo, pero no quería entrar en detalles.
Te he llamado la atención porque el chartRedraw() no redibuja el objeto canvas, sólo se redibuja duranteUpdate(). Y si se utiliza ObjectSetInteger para redibujar el objeto canvas basta con forzar ChartRedraw() o esperar el cambio de gráfico o la llegada de un nuevo tick, cuando se produce ChartRedraw().