Merci ! Cette option semble tout à fait réaliste !
Merci pour votre question, car en y répondant, je me suis rendu compte d'une chose très importante que j'ignorais. Je serais surpris si quelqu'un était au courant de tout ça.
Si vous redimensionnez un canevas ou sa position à l'aide d'ObjectSetInteger, vous n'avez pas besoin de le redessiner.
Même si nous redimensionnons le kanvas généré, puis le redimensionnons à nouveau, les données du kanvas sont conservées par le dessin original.
Si vous augmentez la taille du kanvas façonné, les données disparaissent, mais réapparaissent lorsque vous le redimensionnez à sa taille initiale.
Lorsque vous redimensionnez ou modifiez la position du kanvas, il n'est même pas nécessaire de faire Update() ou ChartRedraw(), il sera mis à jour avec un nouveau tick ou un changement de fenêtre.
Cet indicateur le démontre. Le canevas est généré une seule fois. Mais sa taille et son emplacement peuvent être modifiés, et le tableau de valeurs est conservé. Il suffit de déplacer la souris sur l'écran
#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(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
Lorsque vous redimensionnez ou changez la position du canevas, vous n'avez même pas besoin de faire Update() ou ChartRedraw(), il sera mis à jour avec un nouveau tick ou un changement de fenêtre.
Eh bien, le terminal appelle ChartRedraw() de lui-même en fonction de ces événements;)
Il existe de nombreuses options en fonction du type de vidéo que vous souhaitez capturer. Que se passe-t-il dans la fenêtre en temps réel avec le pointeur de la souris, les indicateurs, les objets, l'interface graphique ? Ou quelque chose d'autre ?
Je comprends, mais je ne voulais pas entrer dans les détails. J'ai attiré votre attention sur ce point car la fonction chartRedraw() ne redessine pas l'objet canvas, il n'est redessiné que pendant lafonction Update(). Et si vous utilisez ObjectSetInteger pour redessiner l'objet canvas, il suffit de forcer ChartRedraw() ou d'attendre le changement de graphique ou l'arrivée d'un nouveau tick, lorsque ChartRedraw() se produit.
Merci ! Cette option semble tout à fait réaliste !
Merci pour votre question, car en y répondant, je me suis rendu compte d'une chose très importante que j'ignorais.
Je serais surpris si quelqu'un était au courant de tout ça.
Si vous redimensionnez un canevas ou sa position à l'aide d'ObjectSetInteger, vous n'avez pas besoin de le redessiner.
Cet indicateur le démontre. Le canevas est généré une seule fois. Mais sa taille et son emplacement peuvent être modifiés, et le tableau de valeurs est conservé. Il suffit de déplacer la souris sur l'écran
pouvez-vous enregistrer dans une vidéo ?
vous pouvez
cool ! j'espère que ce n'est pas en créant un million d'images et en les assemblant ensuite en une vidéo dans un quelconque éditeur vidéo...))
si vous n'y voyez pas d'inconvénient, veuillez préciser...
cool ! j'espère que ce n'est pas en créant un million d'images et en les assemblant ensuite en une vidéo dans un quelconque éditeur vidéo...))
si vous n'y voyez pas d'inconvénient, veuillez préciser...
Non, bien sûr que non.
Il le fera.
Non, bien sûr que non.
C'est un problème.
vous n'avez pas besoin du code, donnez-moi un indice sur la façon de le faire.
Eh bien, le terminal appelle ChartRedraw() de lui-même en fonction de ces événements;)
pas besoin de code, un conseil pour le faire
Il existe de nombreuses options en fonction du type de vidéo que vous souhaitez capturer. Que se passe-t-il dans la fenêtre en temps réel avec le pointeur de la souris, les indicateurs, les objets, l'interface graphique ? Ou quelque chose d'autre ?
Eh bien, le terminal lui-même appelle ChartRedraw() sur ces événements;)
Je comprends, mais je ne voulais pas entrer dans les détails.
J'ai attiré votre attention sur ce point car la fonction chartRedraw() ne redessine pas l'objet canvas, il n'est redessiné que pendant lafonction Update(). Et si vous utilisez ObjectSetInteger pour redessiner l'objet canvas, il suffit de forcer ChartRedraw() ou d'attendre le changement de graphique ou l'arrivée d'un nouveau tick, lorsque ChartRedraw() se produit.