Ich habe auch den Dreh raus, eine Grafikbibliothek zu erstellen, nur mit den Elementen, die ich brauche.
Der Haupttrick der Bibliothek ist ihre Windowing-Engine:
es hängt nicht von der Grafik ab, man kann sagen, dass virtuelle Fenster ohne eine einzige Funktion mit der Grafik arbeiten, sogar absolut Fenster werden korrekt funktionieren (Ereignisse, Eigenschaften)
Sätze von Eigenschaften für ein Fenster, die sein Verhalten beeinflussen, abhängige Eigenschaften dieses Fensters und andere
als Grafik können Sie sowohl Standard-Objekte und Canvas als auch DirectX verwenden, was immer Sie wollen
Motorfenster sind die Bausteine für den Aufbau grafischer Elemente
Nutzung verschiedener Leistungsoptimierungen (Ausschluss von unnötigen Aufrufen von Grafiksystemfunktionen, sowie Ausschluss vom Zeichnen unsichtbarer Boxen)
Einfachheit bei der Erstellung eines neuen grafischen Elements, sowohl bei der Implementierung des grafischen Designs als auch bei der Erstellung der untergeordneten grafischen Elemente/Fensterstruktur. Alle Ereignisse und Berechnungen von abhängigen Eigenschaften werden auf der Ebene des Motors durchgeführt, es wird nicht zwischen benutzerdefinierten grafischen Elementen unterschieden, es funktioniert nur auf der Ebene der Basisfenster
Anlegen und Löschen des Standardobjekts OBJ_RECTANGLE_LABEL
Dies implementiert eine Methode zum Ändern der Eigenschaften des Standardobjekts OBJ_RECTANGLE_LABEL, indem es die Hilfe durchforstet und die gewünschten Eigenschaften verwendet
bool cV_object_rectangle::_Set_property(eV_object_property property,sV_property_value &property_value)
{
_is_redraw_object=true;
switch(property)
{
case vop_s_is_hidden:
{
if(property_value.data_long)
{
ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,0);
ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,0);
ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,-20);
ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,-20);
}
else
{
ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,_property_values[vop_s_size_real_x].data_long);
ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,_property_values[vop_s_size_real_y].data_long);
ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,_property_values[vop_s_position_real_x].data_long);
ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,_property_values[vop_s_position_real_y].data_long);
}
break;
}
case vop_s_color_back:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_BGCOLOR,property_value.data_long);
break;
}
case vop_border_type:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_BORDER_TYPE,property_value.data_long);
break;
}
case vop_s_color_borders:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_COLOR,property_value.data_long);
break;
}
case vop_s_position_real_x:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,property_value.data_long);
break;
}
case vop_s_position_real_y:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,property_value.data_long);
break;
}
case vop_s_size_real_x:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,property_value.data_long);
break;
}
case vop_s_size_real_y:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,property_value.data_long);
break;
}
case vop_font_size:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_FONTSIZE,property_value.data_long);
break;
}
case vop_line_width:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_WIDTH,property_value.data_long);
break;
}
default:
{
_is_redraw_object=false;
}
}
returntrue;
}
einfache Ereignisbehandlung
Dies ist ein externer Event-Handler, der Name des interessierenden Objekts (Fenster/Grafikelement) kann bei der Erstellung angegeben werden
Die Textbeschriftung wird über eine Leinwand implementiert, da die Breite und Höhe im OBJ_LABEL-Objekt nicht geändert werden können. Aus diesem Grund wird das Rendering durchgeführt, wenn ein CHARTEVENT_ON_PAINT-Ereignis eintritt (was ein erneutes Zeichnen erfordert).
bool cV_object_label::_On_event(const sEvent &event)
{
if(event.id==CHARTEVENT_ON_PAINT)
{
color color_back=clrBlack;
if(CheckPointer(_object_parent))
{
color_back=color(_object_parent._property_values[vop_color_back].data_long);
}
int width=int(_property_values[vop_s_size_real_x].data_long);
int height=int(_property_values[vop_s_size_real_y].data_long);
int x=int(_property_values[vop_s_position_global_x].data_long-_property_values[vop_s_position_real_x].data_long);
int y=int(_property_values[vop_s_position_global_y].data_long-_property_values[vop_s_position_real_y].data_long);
_canvas.Resize(width,height);
width=int(_property_values[vop_size_x].data_long);
height=int(_property_values[vop_size_y].data_long);
_canvas.Erase(ColorToARGB(color_back));
switch(int(_property_values[vop_text_anchor].data_long))
{
caseTA_CENTER:
{
x=x+(width-_canvas.TextWidth(_property_values[vop_text].data_string))/2;
break;
}
caseTA_RIGHT:
{
x=x+(width-_canvas.TextWidth(_property_values[vop_text].data_string));
break;
}
}
_canvas.TextOut(x,y,_property_values[vop_text].data_string,ColorToARGB(color(_property_values[vop_s_color_back].data_long)));//);
_canvas.Update(false);
}
returntrue;
}
Was gerendert und aktualisiert werden soll, wird automatisch bestimmt. Die Eigenschaften werden vor dem Aufruf von ChartRedraw() protokolliert. Ereignisse, die nicht zum Neuzeichnen des Diagramms geführt haben, werden übersprungen.
Getestet wurde die Funktionalität und das Potenzial der 3D-Grafik in MT5 auf einem schwachen Computer mit 4 GB RAM und 2 Prozessorkernen.
Sie funktioniert auch nach einer längeren Programmierpause einwandfrei. Aber das Ding ist schwer und es erfordert viel harte Arbeit, um etwas Ernsthaftes zu schaffen.
Getestet wurde die Funktionalität und das Potenzial der 3D-Grafik in MT5 auf einem schwachen Computer mit 4 GB RAM und 2 Prozessorkernen.
Sie funktioniert auch nach einer längeren Programmierpause einwandfrei. Aber das Ding ist schwer und es erfordert viel harte Arbeit, um etwas Ernsthaftes zu entwickeln.
Für HFT wird 3D meiner Meinung nach für die grafische Analyse des Volumens und des Auftragsflusses in der Tasse nützlich sein. Aber ich weiß nicht, wie ich solche Informationen interpretieren soll.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Wie geht es mit der Bibliothek weiter?
ist alles mehr als in Ordnung.
Ich habe auch den Dreh raus, eine Grafikbibliothek zu erstellen, nur mit den Elementen, die ich brauche.
Der Haupttrick der Bibliothek ist ihre Windowing-Engine:
Anlegen und Löschen des Standardobjekts OBJ_RECTANGLE_LABEL
Dies implementiert eine Methode zum Ändern der Eigenschaften des Standardobjekts OBJ_RECTANGLE_LABEL, indem es die Hilfe durchforstet und die gewünschten Eigenschaften verwendet
- einfache Ereignisbehandlung
Dies ist ein externer Event-Handler, der Name des interessierenden Objekts (Fenster/Grafikelement) kann bei der Erstellung angegeben werdenDie Textbeschriftung wird über eine Leinwand implementiert, da die Breite und Höhe im OBJ_LABEL-Objekt nicht geändert werden können. Aus diesem Grund wird das Rendering durchgeführt, wenn ein CHARTEVENT_ON_PAINT-Ereignis eintritt (was ein erneutes Zeichnen erfordert).
Was gerendert und aktualisiert werden soll, wird automatisch bestimmt. Die Eigenschaften werden vor dem Aufruf von ChartRedraw() protokolliert. Ereignisse, die nicht zum Neuzeichnen des Diagramms geführt haben, werden übersprungen.
Die Demo befindet sich in der angehängten Datei, die oben genannten Quellen werden darin verwendet.
In der Demo werden nicht alle möglichen Eigenschaften angezeigt, sondern nur einige von ihnen:
Bislang ist es noch ein unfertiges Werk.
In der Demo werden nicht alle möglichen Eigenschaften angezeigt, sondern nur einige von ihnen:
Im Moment ist es noch eine Baustelle, die noch nicht abgeschlossen ist.
Viel Erfolg bei der Entwicklung! :)
Viel Erfolg bei der Entwicklung! :)
Danke :)
Getestet wurde die Funktionalität und das Potenzial der 3D-Grafik in MT5 auf einem schwachen Computer mit 4 GB RAM und 2 Prozessorkernen.
Sie funktioniert auch nach einer längeren Programmierpause einwandfrei. Aber das Ding ist schwer und es erfordert viel harte Arbeit, um etwas Ernsthaftes zu schaffen.
Getestet wurde die Funktionalität und das Potenzial der 3D-Grafik in MT5 auf einem schwachen Computer mit 4 GB RAM und 2 Prozessorkernen.
Sie funktioniert auch nach einer längeren Programmierpause einwandfrei. Aber das Ding ist schwer und es erfordert viel harte Arbeit, um etwas Ernsthaftes zu entwickeln.
Für HFT wird 3D meiner Meinung nach für die grafische Analyse des Volumens und des Auftragsflusses in der Tasse nützlich sein.
Aber ich weiß nicht, wie ich solche Informationen interpretieren soll.
Mein Gott, was soll das alles?