Ich möchte eine Benutzeroberfläche mit der Canvas-Klasse zu erstellen. Mein einziges Problem ist, dass ich nicht weiß, wie ich das Dashboard auf dem Diagramm beweglich machen kann.
Ich habe viel gesucht, aber kein Beispiel gefunden. Ich wäre Ihnen dankbar, wenn Sie einen Tipp geben könnten.
Unleash the power of dynamic data representation in your trading strategies or utilities with our comprehensive guide on creating movable GUI in MQL5. Dive into the core concept of chart events and learn how to design and implement simple and multiple movable GUI on the same chart. This article also explores the process of adding elements to your GUI, enhancing their functionality and aesthetic appeal.
Ich möchte eine Benutzeroberfläche mit der Canvas-Klasse zu erstellen. Mein einziges Problem ist, dass ich nicht weiß, wie ich das Dashboard auf dem Diagramm beweglich machen kann.
Ich habe viel gesucht, aber kein Beispiel gefunden. Ich wäre Ihnen dankbar, wenn Sie einen Tipp geben könnten.
Ich habe Ihnen bereits vor 4 Jahren ein Beispiel gegeben :))
Nikolai Semko #: Hier habe ich zum Beispiel ein Skript skizziert, das dies anschaulich demonstriert. Rechts ist dieser schnelle Algorithmus und links ist meiner (etwa 4-10 mal langsamer). .
Ich kann das Bmp-Bild verkleinern, aber die Leinwand bleibt in der gleichen Größe. Aus dem gleichen Grund kann ich das Bild auch nicht vergrößern, es wird auf die ursprüngliche Größe, d.h. die Größe der Leinwand, beschnitten.
Ich verstehe Arrays nicht ganz, können Sie mir das erklären, oder besser ein Beispiel mit Code zeigen:
1. Bildvergrößerung
2. Eine Leinwand, die der Größe des Bildes entspricht, wenn wir es verkleinert oder vergrößert haben.
Ich kann das Bmp-Bild verkleinern, aber die Leinwand bleibt die gleiche Größe. Aus dem gleichen Grund kann ich das Bild nicht vergrößern, es wird um die ursprüngliche Größe, d.h. die Größe der Leinwand, beschnitten.
Ich verstehe Arrays nicht ganz, können Sie mir das erklären, oder besser ein Beispiel mit Code zeigen:
1. Bildvergrößerung
2. Eine Leinwand, die der Größe des Bildes entspricht, wenn wir es verkleinert oder vergrößert haben.
Cool und nützlich. Nur für Interesse, kann dies in MT4 verwendet werden?
Leider gibt es in MQL4 keine Möglichkeit, eine Ressource als Array anzuhängen. Aber alles andere funktioniert.
Natürlich kann es durch harte Tambourine implementiert werden. Fügen Sie z.B. ein PNG-Bild in eine BMP-Datei ein, d.h. fügen Sie einen BMP-Header am Anfang der png-Datei ein und übergeben Sie die png-Datei selbst als bmp-Bild (d.h. wenn Sie eine solche BMP-Datei öffnen, gibt es ein Rauschen von farbigen Pixeln mit unterschiedlicher Transparenz). Und dann fügen Sie diese "bmp-Datei" als Ressource in MQL4 ein. Dies kann für den Markt notwendig sein, damit ex4 bereits ein Bild in einem dichteren png-Format enthält.
Als Referenz: png ist etwa 10-mal kleiner als das gleiche BMP-Bild ohne Qualitätsverlust, zusätzlich unterstützt volle Transparenz.
Die echte BMP-Ressource in der ex5(ex4)-Datei ist in einem komprimierten Format gespeichert, aber nicht um eine Größenordnung kleiner. Es ist notwendig, genau zu prüfen.
Guten Tag an alle. Ich bin auch an diesem Code interessiert. Aber wenn ich Resize() verwende, funktioniert es nicht. Vielleicht sollte es in einer anderen Reihenfolge gemacht werden.
Guten Tag an alle. Ich bin auch an diesem Code interessiert. Aber wenn ich Resize() verwende, funktioniert es nicht. Vielleicht sollte es in einer anderen Reihenfolge gemacht werden.
Okay, ich werde Ihnen später ein Beispiel geben.
Aber ich ziehe es vor, mit einer Leinwand für das gesamte Diagramm zu arbeiten. Das ist in 95 % der Fälle gerechtfertigt.
Nikolai Semko #: Okay, ich werde Ihnen etwas später ein Beispiel geben.
Aber ich ziehe es vor, mit einer Leinwand für das gesamte Diagramm zu arbeiten. Das ist in 95 % der Fälle gerechtfertigt.
Hier ist ein Beispiel, das auf der png.mql Bibliothek basiert, wenn die Bewegung der Maus die Position des Canvas und seine Größe verändert. Befindet sich der Mauszeiger horizontal in der Mitte, entspricht dies der ursprünglichen Größe des Bildes, nach links - verkleinern, nach rechts - vergrößern. Ich musste nur die Variablen C und _C in png.mql von privat auf öffentlich umstellen. Sie müssen also diese Bibliothek überschreiben, wenn sie bereits installiert ist. Dieses Beispiel hat zwei Betriebsarten (Eingabevariable bool resize_canvas):
mit Größenänderung des Canvas bei jeder Größenänderung des Bildes
ohne Größenänderung von Canvas bei jeder Größenänderung des Bildes. Die anfängliche Größe von Canvas ist gleich der maximal möglichen Bildgröße gemäß der Arbeitslogik.
Leider gibt es im ersten Modus in MQL5 einen uralten Fehler des Bildes blinken, die nur auf eine Weise geheilt werden kann - nicht auf die Leinwand Größe zu ändern. Alle meine Versuche, die Funktion CCanvas.Resize() zu ändern, haben zu nichts geführt. Alles blinkt auf die gleiche Weise. Vielleicht kann ja jemand das Problem lösen :))) Deshalb ziehe ich es vor, eine Leinwand für den gesamten Bildschirm zu verwenden!
#define MAX_ZOOM 2#include <Canvas\png.mqh> //https://www.mql5.com/en/code/45439
CPng img("cubes.png"); // Get PNG from a file, create a canvas and display it on the screen at coordinates (X=500, Y=100)inputbool resize_canvas = false;
int chart_width,chart_height;
//+------------------------------------------------------------------+intOnInit() {
img.Resize(resize_canvas?10:img.width*MAX_ZOOM); // формируем массив _bmp[] максимального размера в режиме без изменения размера canvasChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
chart_width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
chart_height = (int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);
img._CreateCanvas(chart_width/3, chart_height/3);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+voidOnDeinit(constint reason) {
}
//+------------------------------------------------------------------+voidOnTick() {
}
//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &sparam) {
if (id == CHARTEVENT_MOUSE_MOVE) {
double new_width = img.width*(MAX_ZOOM*(double)lparam/chart_width);
img.Resize(new_width);
if (resize_canvas) { // режим с изменением размера canvas Моргает!!!img._C.Resize(img._width,img._height);ArrayCopy(img._C.m_pixels,img._bmp);
} else { // режим без изменения размера canvas не Мограет!!!img._C.Erase(0x00FFFFFF);for(int i =0; i++<img._height;) ArrayCopy(img._C.m_pixels,img._bmp,int(i*img.width*MAX_ZOOM),i*img._width,img._width);
}
img._C.Update();
img._MoveCanvas(int(lparam)/5, int(dparam)/5);
}
}
Forget about BMP files like a bad dream. Thanks to this library, you can now use the PNG format, which has a number of advantages, such as being more compact without losing image quality and maintaining transparency.
Sie könnten mit diesem Artikel beginnen: https: //www.mql5.com/en/articles/12751
Sie könnten mit diesem Artikel beginnen: https: //www.mql5.com/en/articles/12751
Großartig...Vielen Dank!
Ich habe Ihnen bereits vor 4 Jahren ein Beispiel gegeben :))
Forum über Handel, automatisierte Handelssysteme und das Testen von Handelsstrategien
Wie kann man alle Objekte in 1 Objekt umwandeln?
Nikolai Semko, 2019.10.05 22:39
In der Tat, Canvas ist die Lösung.
Und Canvas ist viel einfacher, als es auf den ersten Blick scheint.
Hier ist ein primitives Beispiel für einen Indikator (MQL5 & MQL4) mit einem Objekt OBJ_BITMAP_LABEL, in dem es viele Fenster gibt.
n diesem neuen Artikel finden Sie eine weitere Möglichkeit zur Implementierung von Informationspanels.
https://www.mql5.com/ru/articles/13179

Hier habe ich zum Beispiel ein Skript skizziert, das dies anschaulich demonstriert. Rechts ist dieser schnelle Algorithmus und links ist meiner (etwa 4-10 mal langsamer).
.
Ich kann das Bmp-Bild verkleinern, aber die Leinwand bleibt in der gleichen Größe. Aus dem gleichen Grund kann ich das Bild auch nicht vergrößern, es wird auf die ursprüngliche Größe, d.h. die Größe der Leinwand, beschnitten.
Ich verstehe Arrays nicht ganz, können Sie mir das erklären, oder besser ein Beispiel mit Code zeigen:
1. Bildvergrößerung
2. Eine Leinwand, die der Größe des Bildes entspricht, wenn wir es verkleinert oder vergrößert haben.
Wir danken Ihnen.
Nikolai Semko, hallo. In diesem Beispiel https://www.mql5.com/ru/forum/227736/page66#comment_20456641 haben Sie die Größenänderung (Verkleinerung) von Bmp demonstriert.
Ich kann das Bmp-Bild verkleinern, aber die Leinwand bleibt die gleiche Größe. Aus dem gleichen Grund kann ich das Bild nicht vergrößern, es wird um die ursprüngliche Größe, d.h. die Größe der Leinwand, beschnitten.
Ich verstehe Arrays nicht ganz, können Sie mir das erklären, oder besser ein Beispiel mit Code zeigen:
1. Bildvergrößerung
2. Eine Leinwand, die der Größe des Bildes entspricht, wenn wir es verkleinert oder vergrößert haben.
Vielen Dank!
Cool und nützlich. Nur für Interesse, kann dies in MT4 verwendet werden?
Guten Tag an alle. Ich bin auch an diesem Code interessiert. Aber wenn ich Resize() verwende, funktioniert es nicht. Vielleicht sollte es in einer anderen Reihenfolge gemacht werden.
Guten Tag an alle. Ich bin auch an diesem Code interessiert. Aber wenn ich Resize() verwende, funktioniert es nicht. Vielleicht sollte es in einer anderen Reihenfolge gemacht werden.
Okay, ich werde Ihnen etwas später ein Beispiel geben.
Für ein Code-Beispiel wäre ich sehr dankbar. Vielen Dank im Voraus...
Okay, ich werde Ihnen etwas später ein Beispiel geben.
Hier ist ein Beispiel, das auf der png.mql Bibliothek basiert, wenn die Bewegung der Maus die Position des Canvas und seine Größe verändert. Befindet sich der Mauszeiger horizontal in der Mitte, entspricht dies der ursprünglichen Größe des Bildes, nach links - verkleinern, nach rechts - vergrößern.
Ich musste nur die Variablen C und _C in png.mql von privat auf öffentlich umstellen. Sie müssen also diese Bibliothek überschreiben, wenn sie bereits installiert ist.
Dieses Beispiel hat zwei Betriebsarten (Eingabevariable bool resize_canvas):
Deshalb ziehe ich es vor, eine Leinwand für den gesamten Bildschirm zu verwenden!