Ho anche imparato a fare una libreria grafica, solo con gli elementi di cui ho bisogno.
Il trucco principale della libreria è il suo motore a finestre:
non dipende dalla grafica, si può dire finestre virtuali senza una sola funzione per lavorare con la grafica, anche le finestre in assoluto funzioneranno correttamente (eventi, proprietà)
insiemi di proprietà per una finestra che influenzano il suo comportamento, proprietà dipendenti di quella finestra e altre
come grafica potete usare sia oggetti standard che canvas, e DirectX, quello che volete
le finestre del motore sono i mattoni per costruire elementi grafici
uso di diverse ottimizzazioni per le prestazioni (esclusione di chiamate inutili di funzioni del sistema grafico, così come l'esclusione del disegno di caselle invisibili)
Semplicità nella creazione di un nuovo elemento grafico, sia l'implementazione del disegno grafico che la creazione di elementi grafici figli/struttura delle finestre. Tutti gli eventi e il calcolo delle proprietà dipendenti saranno eseguiti a livello di motore, non distingue gli elementi grafici personalizzati, funziona solo a livello di finestre di base
Creare e cancellare l'oggetto standard OBJ_RECTANGLE_LABEL
Questo implementa un metodo per cambiare le proprietà dell'oggetto standard OBJ_RECTANGLE_LABEL, scorrendo la guida e utilizzando le proprietà di interesse
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;
}
facile gestione degli eventi
Questo è un gestore di eventi esterno, il nome dell'oggetto di interesse (finestra/oggetto grafico) può essere specificato quando lo si crea
L'etichetta di testo è implementata tramite kanvas perché la larghezza e l'altezza non possono essere cambiate nell'oggetto OBJ_LABEL, e per questo motivo il rendering viene eseguito quando si verifica un evento CHARTEVENT_ON_PAINT (che richiede un ridisegno)
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;
}
Cosa rendere e aggiornare viene determinato automaticamente. Le proprietà sono registrate prima di chiamare ChartRedraw() . Gli eventi che non hanno causato il ridisegno del grafico vengono saltati.
Testato la funzionalità e il potenziale della grafica 3D in MT5 su un computer debole con 4 GB di RAM e 2 core del processore.
Funziona bene anche dopo una lunga pausa nella programmazione. Ma la cosa è pesante e ci vuole molto lavoro per sviluppare qualcosa di serio.
Per l'HFT, penso che il 3D sarà utile per l'analisi grafica del volume della tazza e del flusso degli ordini. Ma non so come interpretare tali informazioni.
Come procede la biblioteca?
tutto va più che bene.
Ho anche imparato a fare una libreria grafica, solo con gli elementi di cui ho bisogno.
Il trucco principale della libreria è il suo motore a finestre:
Creare e cancellare l'oggetto standard OBJ_RECTANGLE_LABEL
Questo implementa un metodo per cambiare le proprietà dell'oggetto standard OBJ_RECTANGLE_LABEL, scorrendo la guida e utilizzando le proprietà di interesse
- facile gestione degli eventi
Questo è un gestore di eventi esterno, il nome dell'oggetto di interesse (finestra/oggetto grafico) può essere specificato quando lo si creaL'etichetta di testo è implementata tramite kanvas perché la larghezza e l'altezza non possono essere cambiate nell'oggetto OBJ_LABEL, e per questo motivo il rendering viene eseguito quando si verifica un evento CHARTEVENT_ON_PAINT (che richiede un ridisegno)
Cosa rendere e aggiornare viene determinato automaticamente. Le proprietà sono registrate prima di chiamare ChartRedraw() . Gli eventi che non hanno causato il ridisegno del grafico vengono saltati.
Il demo è nel file allegato, le fonti di cui sopra sono utilizzate in esso.
Il demo non mostra tutte le proprietà possibili, solo alcune:
È ancora un lavoro in corso, per ora.
Il demo non mostra tutte le proprietà possibili, solo alcune:
È ancora un lavoro in corso, per ora.
Buona fortuna per lo sviluppo! :)
Buona fortuna per lo sviluppo! :)
Grazie :)
Testato la funzionalità e il potenziale della grafica 3D in MT5 su un computer debole con 4 GB di RAM e 2 core del processore.
Funziona bene anche dopo una lunga pausa nella programmazione. Ma la cosa è pesante e ci vuole molto lavoro per creare qualcosa di serio.
Testato la funzionalità e il potenziale della grafica 3D in MT5 su un computer debole con 4 GB di RAM e 2 core del processore.
Funziona bene anche dopo una lunga pausa nella programmazione. Ma la cosa è pesante e ci vuole molto lavoro per sviluppare qualcosa di serio.
Per l'HFT, penso che il 3D sarà utile per l'analisi grafica del volume della tazza e del flusso degli ordini.
Ma non so come interpretare tali informazioni.
Mio Dio, a cosa serve tutto questo?