Ich danke Ihnen! Diese Option sieht sehr realistisch aus!
Ich danke Ihnen für Ihre Frage, denn bei der Beantwortung ist mir eine sehr wichtige Sache klar geworden, die ich nicht kannte. Ich wäre überrascht, wenn überhaupt jemand davon wüsste.
Wenn Sie die Größe einer Leinwand oder ihre Position mit ObjectSetInteger ändern, müssen Sie sie nicht neu zeichnen.
Selbst wenn wir die Größe des generierten Kanvas ändern und dann wieder zurücksetzen, bleiben die Kanvas-Daten in der ursprünglichen Zeichnung erhalten.
Wenn Sie die Größe der geformten Leinwand vergrößern, verschwinden die Daten, tauchen aber wieder auf, wenn Sie die ursprüngliche Größe wiederherstellen.
Wenn die Größe oder die Position des Kanvas geändert wird, ist es nicht einmal notwendig, Update() oder ChartRedraw() auszuführen, es wird mit einem neuen Tick oder Fensterwechsel aktualisiert.
Dieser Indikator zeigt dies an. Die Leinwand wird nur einmal erstellt. Seine Größe und Position kann jedoch geändert werden, und die Wertepalette bleibt erhalten. Bewegen Sie einfach die Maus über den Bildschirm
#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(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
Wenn Sie die Größe oder die Position des Canvas ändern, brauchen Sie nicht einmal Update() oder ChartRedraw() auszuführen, es wird mit einem neuen Tick oder Fensterwechsel aktualisiert.
Je nachdem, welche Art von Video Sie aufnehmen möchten, gibt es eine Vielzahl von Optionen. Was genau passiert im Fenster in Echtzeit mit Mauszeiger, Indikatoren, Objekten, GUI ? Oder etwas anderes?
Ich verstehe es, ich wollte nur nicht ins Detail gehen. Ich habe Sie darauf aufmerksam gemacht, weil die Funktion chartRedraw() das Canvas-Objekt nicht neu zeichnet, sondern nur währendUpdate(). Und wenn Sie ObjectSetIntegerverwenden, um das Canvas-Objekt neu zu zeichnen, reicht es aus, ChartRedraw() zu erzwingen oder auf die Änderung des Diagramms oder das Eintreffen eines neuen Ticks zu warten, wenn ChartRedraw() auftritt.
Ich danke Ihnen! Diese Option sieht sehr realistisch aus!
Ich danke Ihnen für Ihre Frage, denn bei der Beantwortung ist mir eine sehr wichtige Sache klar geworden, die ich nicht kannte.
Ich wäre überrascht, wenn überhaupt jemand davon wüsste.
Wenn Sie die Größe einer Leinwand oder ihre Position mit ObjectSetInteger ändern, müssen Sie sie nicht neu zeichnen.
Dieser Indikator zeigt dies an. Die Leinwand wird nur einmal erstellt. Seine Größe und Position kann jedoch geändert werden, und die Wertepalette bleibt erhalten. Bewegen Sie einfach die Maus über den Bildschirm
können Sie ein Video speichern?
können Sie
cool! Hoffentlich nicht, indem man eine Million Bilder erstellt und sie dann in einem Video-Editor zu einem Video zusammenfügt?))
Wenn es Ihnen nichts ausmacht, erläutern Sie das bitte
cool! Hoffentlich nicht, indem man eine Million Bilder erstellt und sie dann in einem Video-Editor zu einem Video zusammenfügt?))
Wenn es Ihnen nichts ausmacht, erläutern Sie das bitte
Nein, natürlich nicht.
Das wird sie.
Nein, das ist natürlich nicht der Fall.
Es ist mühsam.
Sie brauchen den Code nicht, geben Sie mir einen Tipp, wie man es macht.
Nun, das Terminal ruft ChartRedraw() nach diesen Ereignissen von selbst auf ;)
kein Code erforderlich, Hinweis, wie man es macht
Je nachdem, welche Art von Video Sie aufnehmen möchten, gibt es eine Vielzahl von Optionen. Was genau passiert im Fenster in Echtzeit mit Mauszeiger, Indikatoren, Objekten, GUI ? Oder etwas anderes?
Nun, das Terminal selbst ruft bei diesen Ereignissen ChartRedraw() auf ;)
Ich verstehe es, ich wollte nur nicht ins Detail gehen.
Ich habe Sie darauf aufmerksam gemacht, weil die Funktion chartRedraw() das Canvas-Objekt nicht neu zeichnet, sondern nur währendUpdate(). Und wenn Sie ObjectSetIntegerverwenden, um das Canvas-Objekt neu zu zeichnen, reicht es aus, ChartRedraw() zu erzwingen oder auf die Änderung des Diagramms oder das Eintreffen eines neuen Ticks zu warten, wenn ChartRedraw() auftritt.