//+------------------------------------------------------------------+ //| ParteInf.mqh | //| Copyright 2025, Niquel Mendoza. | //| https://www.mql5.com/es/users/nique_372/news | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, Niquel Mendoza." #property link "https://www.mql5.com/es/users/nique_372/news" #property strict #ifndef HISTOGRAM_PARTE_INFORMATIVA_MAIN_BY_LEO_MQH #define HISTOGRAM_PARTE_INFORMATIVA_MAIN_BY_LEO_MQH #include "..\\General\\Canvas.mqh" #include #include "..\\General\\ARGBGenerator.mqh" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ /* Por defecto para los "objetos (texot, lengenda)" que requierna texto los parametros font y fontsize seran invalidos, si no se espcifica un font o fontsize (como esta) se usara el font y fontsize de canva, esto es util si se quiere agregar textos con el mismo fonty fontsize sin tener que llamar a textsetfont... para eso se debera de llamar a la fucion TextSetFont que setea el font global y tambien guarda dichos valores dentro de canvas que luego seran consultados */ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ enum ENUM_HISTOGRAM_PARTE_INFORMATIVA_POSICION { HISTOGRAM_PARTE_INF_DERECHA, HISTOGRAM_PARTE_INF_IZQUIERDA }; struct HistogramPartInfLineSep { int x1; int y1; int x2; int y2; int gap_init; int gap_end; uint clr; uint style; }; struct HistogramPartInfText { string text; int x; int y; uint clr; int fontsize; string font; }; struct HistogramPartInfLegend { HistogramPartInfText text; int x1; int y1; int x2; int y2; int x1_borde; int x2_borde; int y1_borde; int y2_borde; uint clr_fondo; uint clr_borde; //--- void CalcCordinatesBorde() // Funcion qeu calcula las cordenas de los bordes { x1_borde = x1 - 1; y1_borde = y1 - 1; x2_borde = x2 + 1; y2_borde = y2 + 1; } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CHistogramParteInfo { private: //--- Puntero a canvas (lo da la clase principal CHIsotgramn) CCanvasCustom* m_canvas; bool m_init; int m_espacio_x1; int m_espacio_y1; int m_espacio_x2; int m_espacio_y2; int m_espacio_width; int m_espacio_height; //--- Data HistogramPartInfLegend m_lengendas[]; // Legendas (y texto) int m_lengedas_size; HistogramPartInfLineSep m_lines_sep[]; // Line H speradora int m_lines_sep_size; HistogramPartInfText m_texts[]; // Textos; int m_texts_size; //--- Cordenadas actulzes de escritura int m_curr_x; int m_curr_y; //--- static uint m_text_alingement; //--- void RedrawPixels(); void ChangeY(int delta_y, int min_y); public: CHistogramParteInfo(void); //--- Inicilizacion void Init(CCanvasCustom* c, int x1, int y1, int x2, int y2, int gap_x_inicial, int gap_y_inicial); //--- Cambio de cordenadas // Cuando se cambia los tamaño se reajuista las lineas separadoras // Los altos y anchos de los textos NO SE RE REDUCEN precaucion, puede ocurrir bugs void ChangeSizes(int new_width, int new_height); // Cuando se cambia de cordenas se recalculta todo void ChangeCordinates(int x1, int y1, int x2, int y2); // void ChangeCordinatesOne(int x1, int y1); //--- Añadir data int AddLineSeparadora(int gap_init, int gap_end, uint clr, int y_avanzar, ENUM_LINE_STYLE style, bool update = false); int AddText(const string &new_text, uint clr, int y_a_avanzar, int x_a_avanzar, string font = NULL, int font_size = 0, bool update = false); int AddLegend(const string &new_text, uint clr_text, uint clr_rect, uint clr_rect_borde, int xgap, int rect_width, int rect_height, int y_a_avanzar, int x_a_avanzar, string font = NULL, int font_size = 0, bool update = false); //--- Obtener tamaños __forceinline int SizeLegendas() const { return m_lengedas_size; } __forceinline int SizeTextos() const { return m_texts_size; } __forceinline int SizeLineasSep() const { return m_lines_sep_size; } //--- Eliminar void Clean(uint clr_clean); void CleanEspacio(uint clr_clean); void RemoveLineSep(const int index, uint clr_clean, bool move_cordinates, bool redraw = false); void RemoveText(const int index, uint clr_clean, bool move_cordinates, bool redraw = false); void RemoveLegenda(const int index, uint clr_clean, bool move_cordinates, bool redraw = false); //--- Modificar data existente u Obtener data existente // Use el de la clase que lo tiene no este //__forceinline void TextFontSet(int fontsize, string font); // Setea la fuente para proximos textos //- Colores de la legenda void LegendaSetNewsColors(const int index, uint new_clr_fondo, uint new_clr_borde, bool update = false); __forceinline uint LegendaColorFondo(const int index) const { return m_lengendas[index].clr_fondo; } __forceinline uint LegendaColorBorde(const int index) const { return m_lengendas[index].clr_borde; } //- Texto de la legenda void LegendaTextoValue(const int index, const string& new_value, uint clr_clean, string font = NULL, int font_size = 0, bool update = false); __forceinline string LegendaTextoValue(const int index) const { return m_lengendas[index].text.text; } void LegendaTextoColor(const int index, uint new_text_clr, bool update = false); __forceinline uint LegendaTextoColor(const int index) const { return m_lengendas[index].text.clr; } __forceinline HistogramPartInfText LegendaTexto(const int index) const { return m_lengendas[index].text; } //- Texto void TextoValue(const int index, const string& new_value, uint clr_clean, bool redraw = false); __forceinline string TextoValue(const int index) const { return m_texts[index].text; } void TextoColor(const int index, uint new_clr, bool redraw = false); __forceinline uint TextoColor(const int index) const { return m_texts[index].clr; } //- Linea separadora void LineaSeparadoraStyle(const int index, uint new_style, bool redraw = false); __forceinline uint LineaSeparadoraStyle(const int index) const { return m_lines_sep[index].style; } void LineaSeparadoraColor(const int index, uint new_clr, bool redraw = false); __forceinline uint LineaSeparadoraColor(const int index) const { return m_lines_sep[index].clr; } //--- Cordenas de escritura // X __forceinline int CurrX() const { return m_curr_x; } inline void CurrX(const int new_value) { m_curr_x = new_value; } inline void CurrXAument(int value_add = 1) { m_curr_x += value_add; } inline void CurrXReduce(int rest_value = 1) { m_curr_x -= rest_value; } // y __forceinline int CurrY() const { return m_curr_y; } inline void CurrY(const int new_value) { m_curr_y = new_value; } inline void CurrYAument(int value_add = 1) { m_curr_y += value_add; } inline void CurrYReduce(int rest_value = 1) { m_curr_y -= rest_value; } //--- Cordenadas __forceinline int X1() const { return m_espacio_x1; } __forceinline int X2() const { return m_espacio_x2; } __forceinline int Y1() const { return m_espacio_y1; } __forceinline int Y2() const { return m_espacio_y2; } __forceinline int Width() const { return m_espacio_width; } __forceinline int Height() const { return m_espacio_height; } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ uint CHistogramParteInfo::m_text_alingement = TA_TOP | TA_LEFT; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CHistogramParteInfo::CHistogramParteInfo(void) { //--- General m_canvas = NULL; m_init = false; m_espacio_x1 = 0; m_espacio_y1 = 0; m_espacio_x2 = 0; m_espacio_y2 = 0; m_espacio_width = 0; m_espacio_height = 0; //--- Data ArrayResize(m_lengendas, 0); // Legendas (y texto) m_lengedas_size = 0; ArrayResize(m_lines_sep, 0); // Line H speradora m_lines_sep_size = 0; ArrayResize(m_texts, 0); // Textos; m_texts_size = 0; //--- Cordenadas actulzes de escritura m_curr_x = 0; m_curr_y = 0; } //+------------------------------------------------------------------+ //| Elimina un texto | //+------------------------------------------------------------------+ void CHistogramParteInfo::RemoveText(const int index, uint clr_clean, bool move_cordinates, bool redraw = false) { //--- Limpiar visualmente el texto ::TextSetFont(m_texts[index].font, m_texts[index].fontsize); m_canvas.TextOuTF(m_texts[index].x, m_texts[index].y, m_texts[index].text, clr_clean, m_text_alingement); //--- Mover elementos posteriores si se solicita if(move_cordinates) { // Calcular altura del texto eliminado uint w, h; ::TextGetSize(m_texts[index].text, w, h); // Retroceder elementos posteriores const int y_retroceso = (int)h; ChangeY(-y_retroceso, m_texts[index].y); } //--- Eliminar del array for(int i = index; i < m_texts_size - 1; i++) m_texts[i] = m_texts[i + 1]; m_texts_size--; ArrayResize(m_texts, m_texts_size); //--- Redraw si se solicita if(redraw) m_canvas.Update(); } //+------------------------------------------------------------------+ //| Elimina una leyenda | //+------------------------------------------------------------------+ void CHistogramParteInfo::RemoveLegenda(const int index, uint clr_clean, bool move_cordinates, bool redraw = false) { //--- Limpiamos pixeles // Texto ::TextSetFont(m_lengendas[index].text.font, m_lengendas[index].text.fontsize); m_canvas.TextOuTF(m_lengendas[index].text.x, m_lengendas[index].text.y, m_lengendas[index].text.text, clr_clean, m_text_alingement); // Rectangulo m_canvas.FillRectangle(m_lengendas[index].x1_borde, m_lengendas[index].y1_borde, m_lengendas[index].x2_borde, m_lengendas[index].y2_borde, clr_clean); //--- Movemos cordenadas if(move_cordinates) { //--- Cargamos el font y fontsize ::TextSetFont(m_lengendas[index].text.font, m_lengendas[index].text.fontsize); //--- Calculo del y ocupado por el texto uint text_w, text_h; ::TextGetSize(m_lengendas[index].text.text, text_w, text_h); //--- Calcula el "y" maximo int rect_height = m_lengendas[index].y2 - m_lengendas[index].y1; int y_retroceso = (int)text_h > rect_height ? (int)text_h : rect_height; //--- Mover ChangeY(-y_retroceso, m_lengendas[index].text.y); } //--- for(int i = index; i < m_lengedas_size - 1; i++) m_lengendas[i] = m_lengendas[i + 1]; //--- m_lengedas_size--; ArrayResize(m_lengendas, m_lengedas_size); //--- if(redraw) m_canvas.Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // Funcion que se ejeuycta cuando se elimina uyn elemento y deja un "deltay" void CHistogramParteInfo::ChangeY(int delta_y, int min_y) { //--- Texto for(int i = 0; i < m_texts_size; i++) { if(m_texts[i].y < min_y) continue; // Si el y es menor continua m_texts[i].y += delta_y; } //--- Legenda for(int i = 0; i < m_lengedas_size; i++) { if(m_lengendas[i].text.y < min_y) continue; // Si el y es menor continua m_lengendas[i].text.y += delta_y; m_lengendas[i].y1 += delta_y; m_lengendas[i].y2 += delta_y; m_lengendas[i].CalcCordinatesBorde(); } //--- Linea separadora for(int i = 0; i < m_lines_sep_size; i++) { if(m_lines_sep[i].y1 < min_y) continue; // Si el y es menor continua m_lines_sep[i].y1 += delta_y; m_lines_sep[i].y2 += delta_y; } //--- RedrawPixels(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::RemoveLineSep(const int index, uint clr_clean, bool move_cordinates, bool redraw = false) { //--- m_canvas.LineAA(m_lines_sep[index].x1, m_lines_sep[index].y1, m_lines_sep[index].x2, m_lines_sep[index].y1, clr_clean, m_lines_sep[index].style); //--- if(move_cordinates) { const int y_retroceso = fabs(m_lines_sep[index].y1 - m_lines_sep[index].y2); ChangeY(-y_retroceso, m_lines_sep[index].y1); } //--- for(int i = index; i < m_lines_sep_size - 1; i++) m_lines_sep[i] = m_lines_sep[i + 1]; //--- m_lines_sep_size--; ArrayResize(m_lines_sep, m_lines_sep_size); //--- if(redraw) m_canvas.Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::RedrawPixels(void) { //--- Texto for(int i = 0; i < m_texts_size; i++) { ::TextSetFont(m_texts[i].font, m_texts[i].fontsize); m_canvas.TextOuTF(m_texts[i].x, m_texts[i].y, m_texts[i].text, m_texts[i].clr, m_text_alingement); } //--- Legenda for(int i = 0; i < m_lengedas_size; i++) { ::TextSetFont(m_lengendas[i].text.font, m_lengendas[i].text.fontsize); m_canvas.TextOuTF(m_lengendas[i].text.x, m_lengendas[i].text.y, m_lengendas[i].text.text, m_lengendas[i].text.clr, m_text_alingement); //--- m_canvas.Rectangle(m_lengendas[i].x1_borde, m_lengendas[i].y1_borde, m_lengendas[i].x2_borde, m_lengendas[i].y2_borde, m_lengendas[i].clr_borde); //--- m_canvas.FillRectangle(m_lengendas[i].x1, m_lengendas[i].y1, m_lengendas[i].x2, m_lengendas[i].y2, m_lengendas[i].clr_fondo); } //--- Linea separadora for(int i = 0; i < m_lines_sep_size; i++) { m_canvas.LineAA(m_lines_sep[i].x1, m_lines_sep[i].y1, m_lines_sep[i].x2, m_lines_sep[i].y2, m_lines_sep[i].clr, m_lines_sep[i].style); } } //+------------------------------------------------------------------+ //| Mueve solo el origen (x1, y1) manteniendo el tamaño | //+------------------------------------------------------------------+ void CHistogramParteInfo::ChangeCordinatesOne(int x1, int y1) { //--- Calcular cuánto se movió int delta_x = x1 - m_espacio_x1; int delta_y = y1 - m_espacio_y1; //--- Actualizar coordenadas manteniendo el tamaño m_espacio_x1 = x1; m_espacio_y1 = y1; m_espacio_x2 = x1 + m_espacio_width; m_espacio_y2 = y1 + m_espacio_height; //--- Texto for(int i = 0; i < m_texts_size; i++) { m_texts[i].x += delta_x; m_texts[i].y += delta_y; } //--- Legenda for(int i = 0; i < m_lengedas_size; i++) { m_lengendas[i].text.x += delta_x; m_lengendas[i].text.y += delta_y; m_lengendas[i].x1 += delta_x; m_lengendas[i].x2 += delta_x; m_lengendas[i].y1 += delta_y; m_lengendas[i].y2 += delta_y; m_lengendas[i].CalcCordinatesBorde(); } //--- Linea separadora for(int i = 0; i < m_lines_sep_size; i++) { m_lines_sep[i].x1 += delta_x; m_lines_sep[i].x2 += delta_x; m_lines_sep[i].y1 += delta_y; m_lines_sep[i].y2 += delta_y; } //--- RedrawPixels(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::ChangeSizes(int new_width, int new_height) { // Actualizar dimensiones m_espacio_width = new_width; m_espacio_height = new_height; m_espacio_x2 = m_espacio_x1 + new_width; m_espacio_y2 = m_espacio_y1 + new_height; // Solo las líneas separadoras necesitan recalcularse // (porque dependen del ancho x2) for(int i = 0; i < m_lines_sep_size; i++) { m_lines_sep[i].x2 = m_espacio_x2 - m_lines_sep[i].gap_end; m_canvas.LineAA(m_lines_sep[i].x1, m_lines_sep[i].y1, m_lines_sep[i].x2, m_lines_sep[i].y2, m_lines_sep[i].clr, m_lines_sep[i].style); } // Textos y leyendas NO cambian (mantienen su posición absoluta) } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::ChangeCordinates(int x1, int y1, int x2, int y2) { const int cambio_x = x1 - m_espacio_x1; const int cambio_y = y1 - m_espacio_y1; //--- m_espacio_x1 = x1; m_espacio_x2 = x2; m_espacio_y1 = y1; m_espacio_y2 = y2; m_espacio_width = fabs(x2 - x1); m_espacio_height = fabs(y2 - y1); //--- Texto for(int i = 0; i < m_texts_size; i++) { // Movemos las cordenadas del texto m_texts[i].x += cambio_x; m_texts[i].y += cambio_y; } //--- Legendas for(int i = 0; i < m_lengedas_size; i++) { // Mover texto m_lengendas[i].text.x += cambio_x; m_lengendas[i].text.y += cambio_y; // Mover rectángulo m_lengendas[i].x1 += cambio_x; m_lengendas[i].x2 += cambio_x; m_lengendas[i].y1 += cambio_y; m_lengendas[i].y2 += cambio_y; // Recalcular bordes m_lengendas[i].CalcCordinatesBorde(); } //--- Linea separadora for(int i = 0; i < m_lines_sep_size; i++) { // Mover en Y con delta m_lines_sep[i].y1 += cambio_y; m_lines_sep[i].y2 += cambio_y; // Recalcular x1 y x2 basado en el nuevo ancho y los gaps m_lines_sep[i].x1 = m_espacio_x1 + m_lines_sep[i].gap_init; m_lines_sep[i].x2 = m_espacio_x2 - m_lines_sep[i].gap_end; } //--- RedrawPixels(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::LineaSeparadoraStyle(const int index, uint new_style, bool redraw = false) { m_lines_sep[index].style = new_style; m_canvas.LineStyleSet(new_style); m_canvas.LineAA(m_lines_sep[index].x1, m_lines_sep[index].y1, m_lines_sep[index].x2, m_lines_sep[index].y2, m_lines_sep[index].clr, m_lines_sep[index].style); //--- Actualizar canvas si se solicita if(redraw) m_canvas.Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::LineaSeparadoraColor(const int index, uint new_clr, bool redraw = false) { m_lines_sep[index].clr = new_clr; m_canvas.LineAA(m_lines_sep[index].x1, m_lines_sep[index].y1, m_lines_sep[index].x2, m_lines_sep[index].y2, m_lines_sep[index].clr, m_lines_sep[index].style); //--- Actualizar canvas si se solicita if(redraw) m_canvas.Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::TextoColor(const int index, uint new_clr, bool redraw = false) { //--- Forzamos la fuente ::TextSetFont(m_texts[index].font, m_texts[index].fontsize); //--- Nuevo valor m_texts[index].clr = new_clr; m_canvas.TextOuTF(m_texts[index].x, m_texts[index].y, m_texts[index].text, m_texts[index].clr, m_text_alingement); //--- Actualizar canvas si se solicita if(redraw) m_canvas.Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::TextoValue(const int index, const string &new_value, uint clr_clean, bool redraw = false) { //--- Foramzamos la fuente ::TextSetFont(m_texts[index].font, m_texts[index].fontsize); //--- Limpiamos m_canvas.TextOuTF(m_texts[index].x, m_texts[index].y, m_texts[index].text, clr_clean, m_text_alingement); //--- Nuevo valor m_texts[index].text = new_value; m_canvas.TextOuTF(m_texts[index].x, m_texts[index].y, m_texts[index].text, m_texts[index].clr, m_text_alingement); //--- Actualizar canvas si se solicita if(redraw) m_canvas.Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::LegendaSetNewsColors(const int index, uint new_clr_fondo, uint new_clr_borde, bool update = false) { //--- Actualizar colores en el struct m_lengendas[index].clr_borde = new_clr_borde; m_lengendas[index].clr_fondo = new_clr_fondo; //--- Redibujar usando las coordenadas de borde ya calculadas m_canvas.Rectangle(m_lengendas[index].x1_borde, m_lengendas[index].y1_borde, m_lengendas[index].x2_borde, m_lengendas[index].y2_borde, new_clr_borde); //--- Luego el fondo interior m_canvas.FillRectangle(m_lengendas[index].x1, m_lengendas[index].y1, m_lengendas[index].x2, m_lengendas[index].y2, new_clr_fondo); //--- Actualizar canvas si se solicita if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::LegendaTextoValue(const int index, const string &new_value, uint clr_clean, string font = NULL, int font_size = 0, bool update = false) { //--- Limpiamos el anterior ::TextSetFont(m_lengendas[index].text.font, m_lengendas[index].text.fontsize); // Cambiamos la fuente a la del texto m_canvas.TextOuTF(m_lengendas[index].text.x, m_lengendas[index].text.y, m_lengendas[index].text.text, clr_clean, m_text_alingement); // Limpaimos //--- Nueva valor m_lengendas[index].text.text = new_value; m_canvas.TextOuTF(m_lengendas[index].text.x, m_lengendas[index].text.y, m_lengendas[index].text.text, m_lengendas[index].text.clr, m_text_alingement); //--- Actualizar canvas si se solicita if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::LegendaTextoColor(const int index, uint new_text_clr, bool update = false) { //--- Forzamos la fuente ::TextSetFont(m_lengendas[index].text.font, m_lengendas[index].text.fontsize); // Cambiamos la fuente a la del texto //--- Cambiamos m_lengendas[index].text.clr = new_text_clr; m_canvas.TextOuTF(m_lengendas[index].text.x, m_lengendas[index].text.y, m_lengendas[index].text.text, m_lengendas[index].text.clr, m_text_alingement); //--- Actualizar canvas si se solicita if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // Limpia todo por loq eu se debera volver a llamar a init void CHistogramParteInfo::Clean(uint clr_clean) { CleanEspacio(clr_clean); m_canvas = NULL; m_init = false; m_espacio_x1 = 0; m_espacio_y1 = 0; m_espacio_x2 = 0; m_espacio_y2 = 0; m_espacio_width = 0; m_espacio_height = 0; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::CleanEspacio(uint clr_clean) { //--- Si se ha inicaod entonces limpiamos canvas if(m_init) { m_canvas.FillRectangle(m_espacio_x1, m_espacio_y1, m_espacio_x2, m_espacio_y2, clr_clean); } // SDi no se inciio solo limpamos data //--- Data ArrayResize(m_lengendas, 0); // Legendas (y texto) m_lengedas_size = 0; ArrayResize(m_lines_sep, 0); // Line H speradora m_lines_sep_size = 0; ArrayResize(m_texts, 0); // Textos; m_texts_size = 0; //--- Cordenadas actulzes de escritura m_curr_x = 0; m_curr_y = 0; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistogramParteInfo::Init(CCanvasCustom* c, int x1, int y1, int x2, int y2, int gap_x_inicial, int gap_y_inicial) { if(m_init) return; //--- Seteo general m_canvas = c; m_espacio_x1 = x1; m_espacio_x2 = x2; m_espacio_y1 = y1; m_espacio_y2 = y2; m_espacio_width = fabs(x2 - x1); m_espacio_height = fabs(y2 - y1); m_init = true; //--- Cordenadas iniciales m_curr_x = m_espacio_x1 + gap_x_inicial; m_curr_y = m_espacio_y1 + gap_y_inicial; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CHistogramParteInfo::AddLegend(const string &new_text, uint clr_text, uint clr_rect, uint clr_rect_borde, int xgap, int rect_width, int rect_height, int y_a_avanzar, int x_a_avanzar, string font = NULL, int font_size = 0, bool update = false) { //--- Damos la opcion de poder hacer el texto custom if(font != NULL && font_size > 0) { ::TextSetFont(font, font_size); } else { // Por precuaciuon anulamos globalemnte, esto para eliminar la inclinacion y flags, que en este caso no existen ::TextSetFont(m_canvas.FontNameGet(), m_canvas.FontSizeGet()); } //--- Texto HistogramPartInfText new_txt; new_txt.text = new_text; new_txt.x = m_curr_x; new_txt.y = m_curr_y; new_txt.clr = clr_text; // Seteamos la fuente y fontsize utilizados para el texto (si se uso externamente el fontset puede haber bugs, asi que lo ideal es usar) // TextFontSet de la clase para prevenir posibles bugs new_txt.font = m_canvas.FontNameGet(); new_txt.fontsize = m_canvas.FontSizeGet(); m_canvas.TextOuTF(m_curr_x, m_curr_y, new_text, clr_text, m_text_alingement); //--- Rectrangulo de legenda uint w, h; ::TextGetSize(new_text, w, h); HistogramPartInfLegend new_legend; new_legend.x1 = m_curr_x + (int)w + xgap; // X1 del rectanuglo new_legend.x2 = new_legend.x1 + rect_width; new_legend.y1 = m_curr_y; new_legend.y2 = m_curr_y + rect_height; new_legend.clr_fondo = clr_rect; new_legend.clr_borde = clr_rect_borde; new_legend.CalcCordinatesBorde(); // Caluclo de las cordenadas del borde // Dibujamos m_canvas.Rectangle(new_legend.x1_borde, new_legend.y1_borde, new_legend.x2_borde, new_legend.y2_borde, clr_rect_borde); // Borde m_canvas.FillRectangle(new_legend.x1, new_legend.y1, new_legend.x2, new_legend.y2, clr_rect); // Interno // Asiganmso texto new_legend.text = new_txt; //--- const int prev_size = m_lengedas_size; ArrayResize(m_lengendas, m_lengedas_size + 1); m_lengendas[m_lengedas_size] = new_legend; m_lengedas_size++; //--- Movemos cordenadas con los gaps especificados m_curr_x += x_a_avanzar; m_curr_y += y_a_avanzar; //--- if(update) m_canvas.Update(); //--- return prev_size; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CHistogramParteInfo::AddLineSeparadora(int gap_init, int gap_end, uint clr, int y_avanzar, ENUM_LINE_STYLE style, bool update = false) { //--- const int x1 = m_espacio_x1 + gap_init; const int x2 = m_espacio_x2 - gap_end; //--- m_canvas.LineAA(x1, m_curr_y, x2, m_curr_y, clr, style); //--- HistogramPartInfLineSep new_line_sep; new_line_sep.x1 = x1; new_line_sep.x2 = x2; new_line_sep.y1 = m_curr_y; new_line_sep.y2 = m_curr_y; new_line_sep.clr = clr; new_line_sep.style = style; new_line_sep.gap_end = gap_end; new_line_sep.gap_init = gap_init; //--- const int prev_size = m_lines_sep_size; ArrayResize(m_lines_sep, m_lines_sep_size + 1); m_lines_sep[m_lines_sep_size] = new_line_sep; m_lines_sep_size++; //--- m_curr_y += y_avanzar; //--- if(update) m_canvas.Update(); //--- return m_lines_sep_size; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CHistogramParteInfo::AddText(const string &new_text, uint clr, int y_a_avanzar, int x_a_avanzar, string font = NULL, int font_size = 0, bool update = false) { //--- Damos la opcion de poder hacer el texto custom if(font != NULL && font_size > 0) { ::TextSetFont(font, font_size); } else { // Por precuaciuon anulamos globalemnte, esto para eliminar la inclinacion y flags, que en este caso no existen ::TextSetFont(m_canvas.FontNameGet(), m_canvas.FontSizeGet()); } //--- Text out m_canvas.TextOuTF(m_curr_x, m_curr_y, new_text, clr, m_text_alingement); //--- HistogramPartInfText new_txt; new_txt.text = new_text; new_txt.x = m_curr_x; new_txt.y = m_curr_y; new_txt.clr = clr; // Seteamos la fuente y fontsize utilizados para el texto (si se uso externamente el fontset puede haber bugs, asi que lo ideal es usar) // TextFontSet de la clase para prevenir posibles bugs new_txt.font = m_canvas.FontNameGet(); new_txt.fontsize = m_canvas.FontSizeGet(); //--- const int prev_size = m_texts_size; ArrayResize(m_texts, m_texts_size + 1); m_texts[m_texts_size] = new_txt; m_texts_size++; //--- Movemos cordenadas con los gaps especificados m_curr_x += x_a_avanzar; m_curr_y += y_a_avanzar; //--- if(update) m_canvas.Update(); //--- return prev_size; } //+------------------------------------------------------------------+ #endif //+------------------------------------------------------------------+