Est-il possible d'obtenir des infobulles (tooltips) différentes lorsque l'on passe la souris sur des éléments graphiques individuels ?
Je suivais le mouvement du CHARTEVENT_MOUSE_MOVE et j'utilisais ensuite les coordonnées du curseur de la souris, qui sont représentées dans Canvas par l'ensemble des données de n'importe quel goût et couleur :
int MouseX; // coordinate X of the current position of the mouse pointerint MouseY; // coordinate Y of the current position of the mouse pointerdouble MouseBar; // the current bar position of the mouse pointerdouble MousePrice; // the current price of the mouse pointerdatetime MouseTime; // the current time of the mouse pointer
Je calculais pour quel objet un indice serait émis :
inputuint i_uFontSize = 14; // Размер шрифта в подсказках#define TOOLTIP_BGCOLOR color(C'255,255,225')
int g_nTooltipWidth = <ширина блока в пикселах>;
int g_nTooltipHeight = <высота блока в пикселах>;
int nY = <расчет положения левого верхнего угла для подсказки>;
Canvas.FillRectangle(W.MouseX, nY, W.MouseX + g_nTooltipWidth, nY + g_nTooltipHeight, ColorToARGB(TOOLTIP_BGCOLOR));
Canvas.Rectangle(W.MouseX, nY, W.MouseX + g_nTooltipWidth, nY + g_nTooltipHeight, ColorToARGB(clrBlack));
Canvas.TextPosition(W.MouseX + 5, nY + 2);
Canvas.CurentFont("Arial", i_uFontSize, i_uFontSize + 2, clrBlack);
Canvas.Comm("<первая строка подсказки>");
Canvas.Comm("<вторая строка подсказки>");
Canvas.Comm("<третья строка подсказки>");
C'est ce que j'ai dit. Je me demande juste - pouvez-vous le faire vous-même, et ne pas simplement répéter mes conseils ? deux d'entre eux sont faciles à sortir... Code, s'il vous plaît. Si vous ne le faites pas, je l'écrirai moi-même demain à mon réveil. Mais alors je traiterai Fedoseev d'idiot. ))
Est-ce que Fedoseyev vient de fuir ou quelque chose comme ça ?
Je ne voulais pas le mettre entre parenthèses.
De deux choses l'une : trop de pseudo-fierté ou trop peu d'intelligence.
Voici le chemin le plus long (pas de beaucoup) dont j'ai parlé au début sans ma bibliothèque et auquel Fedoseev a essayé de céder. C'est la meilleure solution pour votre situation :
#property indicator_chart_window#define width 50#define height 10#define N 20#property indicator_buffers0#property indicator_plots0string obj_name = "Asd_";
double max = 0;
double min = 0;
double w = 0;
double h = 0;//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit() {
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[]) {
if(prev_calculated != rates_total) {
DrawObj();
}
return(rates_total);
}
//+------------------------------------------------------------------+//| ChartEvent function |//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &sparam) {
if(id == CHARTEVENT_CHART_CHANGE) {
w = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
h = (int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);
min = ChartGetDouble(0,CHART_PRICE_MIN);
max = ChartGetDouble(0,CHART_PRICE_MAX);
DrawObj();
}
}
//+------------------------------------------------------------------+//| Выводим на график |//+------------------------------------------------------------------+void DrawObj() {
string GenName = obj_name;
double startPricePos = SymbolInfoDouble(Symbol(),SYMBOL_BID);
double step_Pips = 50*_Point;
double stp = -N*step_Pips;
for(int i=-N; i<=20; i++, stp+=step_Pips)
RectLabelCreate(GenName+"UP_"+IntegerToString(i),startPricePos + stp);
ChartRedraw(0);
}
//+------------------------------------------------------------------+//| Создает прямоугольную метку |//+------------------------------------------------------------------+void RectLabelCreate(string name, // имя меткиdouble price // цена
) {
if (max==min) return;
constlong chart_ID=0; // ID графикаint sub_window=0; // номер подокнаint x=int(w/2); // координата по оси Xint y=int(h*(max-price)/(max-min)); // координата по оси Yconstcolor back_clr=C'236,233,216'; // цвет фонаconstENUM_BORDER_TYPE border=BORDER_SUNKEN; // тип границыconstENUM_BASE_CORNER corner=CORNER_LEFT_UPPER; // угол графика для привязкиconstcolor clr=clrRed; // цвет плоской границы (Flat)constENUM_LINE_STYLE style=STYLE_SOLID; // стиль плоской границыconstint line_width=1; // толщина плоской границыconstbool back=false; // на заднем планеconstbool selection=false; // выделить для перемещенийconstbool hidden=true; // скрыт в списке объектовconstlong z_order=0; // приоритет на нажатие мышьюif(ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0)) {
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border);
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
} elsePrint("Error - " + string(_LastError));
}
Voici la voie la plus longue (pas beaucoup plus longue) dont j'ai parlé au début sans ma bibliothèque et à laquelle Fedoseev a essayé de céder. C'est une solution plus correcte dans votre situation :
Mais vous devez comprendre que le problème de l'asynchronisme des fonctions ChartGet n'est pas résolu par cette solution. Ces fonctions consomment désormais non pas 99,76 % mais un peu moins - 99,1 %.
S'ils n'étaient pas asynchrones, tout évoluerait en même temps que le graphique, au lieu d'être un peu à la traîne.
Merci pour les exemples ! Très clair et informatif, et surtout rapide.
Tous les graphiques de l'exemple sur le kanvas dans les listes d'objets ressemblent à un seul objet.
Est-il possible d'obtenir des infobulles (tooltips) différentes lorsque l'on passe la souris sur des éléments graphiques individuels ?
Ou dois-je créer un objet de toile distinct pour chaque rectangle ? Cela ne va-t-il pas affecter la vitesse ?
Si vous avez un peu de temps, j'attends une réponse, peut-être même un exemple de code.
Vous pouvez utiliser un canevas pour chaque objet au lieu d'un seul. Il sera même un peu plus rapide et le code ne sera pas beaucoup plus gros. En tout cas moins qu'avec des objets. Kanvas est très rapide. Les objets sont bons aussi, à condition qu'ils ne soient pas trop nombreux. Le goulot d'étranglement se produit lorsque les objets sont plusieurs centaines ou un millier. D'ailleurs, c'est la même chose en JavaScript. Il existe également des canevas et des objets (html et CVG). Canvas gagne toujours en vitesse et en capacités graphiques, mais perd en convivialité de contrôle et de gestion. En JS, j'ai moi-même mélangé activement les objets canevas et vectoriels (html, css, svg), en tirant parti des deux. Mais le véritable problème majeur de l'utilisation des canevas dans MQL5 (ainsi que des objets) est l'incroyable fadeur des fonctions ChartGet. Mais cela n'est possible que si vous essayez de vous lier à un graphique de prix. Si vous désactivez l'ensemble du graphique et dessinez votre propre graphique, vous n'aurez pas ce problème.
C'est beaucoup de vanité. Mais vous ne sauriez même pas quelle est la blague de l'humour. C'est embarrassant.
Je suis toujours étonné de voir que tu es un vieux de la vieille, qui essaie toujours de faire quelque chose d'intelligent. Afin de ne pas être douloureux pour les années gâchées.
Mais pour une raison quelconque, il ne sort qu'un pet à chaque fois :))
Je suivais le mouvement du CHARTEVENT_MOUSE_MOVE, puis j'utilisais les coordonnées du curseur de la souris, qui sont représentées dans Canvas par l'ensemble des données, selon les goûts et les couleurs :
calculer pour quel objet une indication doit être affichée :
Nikolai Semko:
vous pouvez utiliser non pas un seul Canvas, mais un pour chaque objet. Il sera même un peu plus rapide et le code ne sera pas beaucoup plus gros. En tout cas moins qu'avec des objets. Kanvas est très rapide. Les objets sont bons aussi, à condition qu'ils ne soient pas trop nombreux. Le ralentissement se produit lorsque les objets deviennent plusieurs centaines ou milliers.
Merci. Je vais essayer de tester les deux variantes.
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Est-il possible d'obtenir des infobulles (tooltips) différentes lorsque l'on passe la souris sur des éléments graphiques individuels ?
Je suivais le mouvement du CHARTEVENT_MOUSE_MOVE et j'utilisais ensuite les coordonnées du curseur de la souris, qui sont représentées dans Canvas par l'ensemble des données de n'importe quel goût et couleur :
Je calculais pour quel objet un indice serait émis :
C'est ce que j'ai dit.
Je me demande juste - pouvez-vous le faire vous-même, et ne pas simplement répéter mes conseils ?
deux d'entre eux sont faciles à sortir...
Code, s'il vous plaît.
Si vous ne le faites pas, je l'écrirai moi-même demain à mon réveil. Mais alors je traiterai Fedoseev d'idiot. ))
Voici le chemin le plus long (pas de beaucoup) dont j'ai parlé au début sans ma bibliothèque et auquel Fedoseev a essayé de céder.
C'est la meilleure solution pour votre situation :
Voici la voie la plus longue (pas beaucoup plus longue) dont j'ai parlé au début sans ma bibliothèque et à laquelle Fedoseev a essayé de céder.
C'est une solution plus correcte dans votre situation :
Mais vous devez comprendre que le problème de l'asynchronisme des fonctions ChartGet n'est pas résolu par cette solution.
Ces fonctions consomment désormais non pas 99,76 % mais un peu moins - 99,1 %.
S'ils n'étaient pas asynchrones, tout évoluerait en même temps que le graphique, au lieu d'être un peu à la traîne.
Encore plus impressionné par cet endroit :
C'est beaucoup de vanité. Mais vous ne sauriez même pas quelle est la blague de cet humour. C'est embarrassant.Fedoseyev a fusionné ou quoi ?
Tu vas perdre ta braguette, bébé.
Merci pour les exemples ! Très clair et informatif, et surtout rapide.
Tous les graphiques de l'exemple sur le kanvas dans les listes d'objets ressemblent à un seul objet.
Est-il possible d'obtenir des infobulles (tooltips) différentes lorsque l'on passe la souris sur des éléments graphiques individuels ?
Ou dois-je créer un objet de toile distinct pour chaque rectangle ? Cela ne va-t-il pas affecter la vitesse ?
Si vous avez un peu de temps, j'attends une réponse, peut-être même un exemple de code.
Vous pouvez utiliser un canevas pour chaque objet au lieu d'un seul.
Il sera même un peu plus rapide et le code ne sera pas beaucoup plus gros. En tout cas moins qu'avec des objets.
Kanvas est très rapide. Les objets sont bons aussi, à condition qu'ils ne soient pas trop nombreux. Le goulot d'étranglement se produit lorsque les objets sont plusieurs centaines ou un millier.
D'ailleurs, c'est la même chose en JavaScript. Il existe également des canevas et des objets (html et CVG). Canvas gagne toujours en vitesse et en capacités graphiques, mais perd en convivialité de contrôle et de gestion.
En JS, j'ai moi-même mélangé activement les objets canevas et vectoriels (html, css, svg), en tirant parti des deux.
Mais le véritable problème majeur de l'utilisation des canevas dans MQL5 (ainsi que des objets) est l'incroyable fadeur des fonctions ChartGet.
Mais cela n'est possible que si vous essayez de vous lier à un graphique de prix.
Si vous désactivez l'ensemble du graphique et dessinez votre propre graphique, vous n'aurez pas ce problème.
Encore plus impressionné par cet endroit :
C'est beaucoup de vanité. Mais vous ne sauriez même pas quelle est la blague de l'humour. C'est embarrassant.Je suis toujours étonné de voir que tu es un vieux de la vieille, qui essaie toujours de faire quelque chose d'intelligent.
Afin de ne pas être douloureux pour les années gâchées.
Je suivais le mouvement du CHARTEVENT_MOUSE_MOVE, puis j'utilisais les coordonnées du curseur de la souris, qui sont représentées dans Canvas par l'ensemble des données, selon les goûts et les couleurs :
calculer pour quel objet une indication doit être affichée :
vous pouvez utiliser non pas un seul Canvas, mais un pour chaque objet.
Il sera même un peu plus rapide et le code ne sera pas beaucoup plus gros. En tout cas moins qu'avec des objets.
Kanvas est très rapide. Les objets sont bons aussi, à condition qu'ils ne soient pas trop nombreux. Le ralentissement se produit lorsque les objets deviennent plusieurs centaines ou milliers.
Merci. Je vais essayer de tester les deux variantes.
Merci. Je vais essayer de vérifier les deux options.
Vitaly, quel éditeur vidéo utilisez-vous pour YouTube ?
Très bien !
Adobe Premiere Pro ?