Je veux créer une interface utilisateur avec la classe Canvas. Mon seul problème est que je ne sais pas comment rendre le tableau de bord mobile sur le graphique.
J'ai beaucoup cherché mais je n'ai pas trouvé d'exemple. Je vous serais reconnaissant si vous pouviez me donner un indice.
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.
Je veux créer une interface utilisateur avec la classe Canvas. Mon seul problème est que je ne sais pas comment rendre le tableau de bord mobile sur le graphique.
J'ai beaucoup cherché mais je n'ai pas trouvé d'exemple. Je vous serais reconnaissant si vous pouviez me donner un indice.
Nikolai Semko #: Ici, par exemple, j'ai esquissé un script qui le démontre clairement. À droite se trouve cet algorithme rapide, et à gauche le mien (environ 4 à 10 fois plus lent). .
Je peux réduire l'image Bmp, mais la toile reste de la même taille. Pour la même raison, je ne peux pas agrandir l'image, elle est rognée par la taille d'origine, c'est-à-dire la taille de la toile.
Je ne comprends pas très bien les tableaux, alors pouvez-vous m'expliquer, ou mieux me montrer un exemple avec du code :
1. Agrandissement de l'image
2. Une toile égale à la taille de l'image si nous l'avons réduite ou agrandie.
Je peux réduire l'image Bmp, mais la toile reste de la même taille. Pour la même raison, je ne peux pas agrandir l'image, elle est rognée par la taille d'origine, c'est-à-dire la taille de la toile.
Je ne comprends pas très bien les tableaux, alors pouvez-vous m'expliquer, ou mieux, me montrer un exemple avec du code :
1. Agrandissement de l'image
2. Une toile égale à la taille de l'image si nous l'avons réduite ou agrandie.
Sympa et utile. Juste par intérêt, est-ce que cela peut être utilisé dans MT4 ?
Malheureusement, dans MQL4, il n'est pas possible d'attacher une ressource en tant que tableau. Mais tout le reste fonctionne.
Bien sûr, cela peut être mis en œuvre par le biais de tambourins durs. Par exemple, insérez une image PNG dans un fichier BMP, c'est-à-dire ajoutez un en-tête BMP au début du png, et passez le png lui-même en tant qu'image BMP (c'est-à-dire que si vous ouvrez un tel BMP, il y aura un bruit de pixels colorés de différentes transparences). Ensuite, attachez ce "fichier bmp" en tant que ressource dans MQL4. Cela peut être nécessaire pour le marché, afin que ex4 contienne déjà une image d'un format png plus dense.
Pour référence : le format png est environ 10 fois plus petit que la même image BMP sans perte de qualité, et supporte en outre une transparence totale.
La ressource BMP réelle dans le fichier ex5(ex4) est stockée dans un format compacté, mais pas dans un ordre de grandeur inférieur. Il est nécessaire de vérifier exactement.
Bonjour à tous. Je suis également intéressé par ce code. Mais lorsque j'utilise Resize(), cela ne fonctionne pas. Peut-être faudrait-il le faire dans un ordre différent.
Bonjour à tous. Je suis également intéressé par ce code. Mais lorsque j'utilise Resize(), cela ne fonctionne pas. Peut-être faudrait-il le faire dans un ordre différent.
D'accord, je vous donnerai un exemple plus tard.
Mais je préfère travailler avec un seul canevas pour l'ensemble du graphique. C'est justifié dans 95 % des cas.
Nikolai Semko #: D'accord, je vous donnerai un exemple un peu plus tard.
Mais je préfère travailler avec un seul canevas pour l'ensemble du graphique. Cela se justifie dans 95 % des cas.
Voici un exemple basé sur la bibliothèque png.mql, où le déplacement de la souris modifie la position du canevas et change sa taille. Si le pointeur de la souris est au centre horizontalement, il correspond à la taille originale de l'image, si vers la gauche - zoom arrière, vers la droite - zoom avant. Seulement j'ai dû repousser les variables C et _C dans png.mql de private à public. Vous devez donc écraser cette bibliothèque si elle est déjà installée. Cet exemple a deux modes de fonctionnement (variable d'entrée bool resize_canvas) :
avec redimensionnement de Canvas à chaque fois que l'image est redimensionnée
sans redimensionner Canvas à chaque fois que l'image est redimensionnée. La taille initiale de Canvas est fixée à la taille maximale possible de l'image selon la logique de travail.
Malheureusement, dans le premier mode de MQL5, il y a un ancien bug de clignotement de l'image, qui ne peut être résolu que d'une seule manière - ne pas changer la taille du canevas. Toutes mes tentatives pour modifier la fonction CCanvas.Resize() n'ont abouti à rien. Tout clignote de la même manière. Peut-être que quelqu'un peut le faire :))) C'est pourquoi je préfère utiliser un seul canevas pour tout l'écran !
#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.
Vous pouvez commencer par cet article : https://www.mql5.com/en/articles/12751
vous pouvez commencer par cet article : https://www.mql5.com/en/articles/12751
Super... Merci beaucoup !
Je vous ai déjà donné un exemple il y a 4 ans :))
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading
Comment convertir tous les objets en 1 objet
Nikolai Semko, 2019.10.05 22:39
En effet, Canvas est la solution.
Et Canvas est beaucoup plus facile qu'il n'y paraît à première vue.
Voici un exemple primitif d'un indicateur (MQL5 & MQL4) avec un objet OBJ_BITMAP_LABEL dans lequel il y a plusieurs fenêtres.
Dans ce nouvel article, une autre option pour mettre en place des panneaux d'information.
https://www.mql5.com/ru/articles/13179

Ici, par exemple, j'ai esquissé un script qui le démontre clairement. À droite se trouve cet algorithme rapide, et à gauche le mien (environ 4 à 10 fois plus lent).
.
Je peux réduire l'image Bmp, mais la toile reste de la même taille. Pour la même raison, je ne peux pas agrandir l'image, elle est rognée par la taille d'origine, c'est-à-dire la taille de la toile.
Je ne comprends pas très bien les tableaux, alors pouvez-vous m'expliquer, ou mieux me montrer un exemple avec du code :
1. Agrandissement de l'image
2. Une toile égale à la taille de l'image si nous l'avons réduite ou agrandie.
Nous vous remercions.
Nikolai Semko, bonjour. Dans cet exemple https://www.mql5.com/ru/forum/227736/page66#comment_20456641, vous avez démontré le redimensionnement (réduction) d'une image Bmp.
Je peux réduire l'image Bmp, mais la toile reste de la même taille. Pour la même raison, je ne peux pas agrandir l'image, elle est rognée par la taille d'origine, c'est-à-dire la taille de la toile.
Je ne comprends pas très bien les tableaux, alors pouvez-vous m'expliquer, ou mieux, me montrer un exemple avec du code :
1. Agrandissement de l'image
2. Une toile égale à la taille de l'image si nous l'avons réduite ou agrandie.
Merci de votre compréhension.
Sympa et utile. Juste par intérêt, est-ce que cela peut être utilisé dans MT4 ?
Bonjour à tous. Je suis également intéressé par ce code. Mais lorsque j'utilise Resize(), cela ne fonctionne pas. Peut-être faudrait-il le faire dans un ordre différent.
Bonjour à tous. Je suis également intéressé par ce code. Mais lorsque j'utilise Resize(), cela ne fonctionne pas. Peut-être faudrait-il le faire dans un ordre différent.
D'accord, je vous donnerai un exemple un peu plus tard.
Je vous serais très reconnaissant de me donner un exemple de code. Merci d'avance...
D'accord, je vous donnerai un exemple un peu plus tard.
Voici un exemple basé sur la bibliothèque png.mql, où le déplacement de la souris modifie la position du canevas et change sa taille. Si le pointeur de la souris est au centre horizontalement, il correspond à la taille originale de l'image, si vers la gauche - zoom arrière, vers la droite - zoom avant.
Seulement j'ai dû repousser les variables C et _C dans png.mql de private à public. Vous devez donc écraser cette bibliothèque si elle est déjà installée.
Cet exemple a deux modes de fonctionnement (variable d'entrée bool resize_canvas) :
C'est pourquoi je préfère utiliser un seul canevas pour tout l'écran !