//+------------------------------------------------------------------+ //| LineCorte.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_FINAL_FILE_LINE_CORTE_BY_LEO_MQH #define HISTOGRAM_FINAL_FILE_LINE_CORTE_BY_LEO_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include "..\\..\\General\\Canvas.mqh" //+------------------------------------------------------------------+ //| Clase Base Abstracta | //+------------------------------------------------------------------+ class CHistogramLineCorteBase { protected: CCanvasCustom* m_canvas; bool m_init; int m_x; int m_y; int m_size; uint m_clr; uint m_clr_clean; public: CHistogramLineCorteBase(void); ~CHistogramLineCorteBase(void) {} void Init(CCanvasCustom* c); void Set(int x, int y, int width, uint clr, uint clr_clean, bool update = false); // Métodos virtuales puros virtual __forceinline void DrawLine(void) = 0; virtual __forceinline void CleanLine(void) = 0; virtual void ReSize(int new_size, bool update = false) = 0; virtual void SetNewValueEjePrincipal(int eje_value, bool clean, bool update = false) = 0; virtual void SetCordenadas(int x, int y, int width, bool update = false) = 0; // Métodos comunes void Color(uint new_value, bool update = false); __forceinline uint Color(void) const { return m_clr; } __forceinline int Size(void) const { return m_size; } __forceinline int X(void) const { return m_x; } __forceinline int Y(void) const { return m_y; } }; //+------------------------------------------------------------------+ //| Constructor Base | //+------------------------------------------------------------------+ CHistogramLineCorteBase::CHistogramLineCorteBase(void) : m_x(0), m_y(0), m_size(0), m_canvas(NULL), m_clr(0x00000000), m_clr_clean(0x00000000), m_init(false) { } //+------------------------------------------------------------------+ //| Inicialización Base | //+------------------------------------------------------------------+ void CHistogramLineCorteBase::Init(CCanvasCustom *c) { if(m_init) return; m_init = true; m_canvas = c; } //+------------------------------------------------------------------+ //| Cambiar Color | //+------------------------------------------------------------------+ void CHistogramLineCorteBase::Color(uint new_value, bool update = false) { m_clr = new_value; DrawLine(); if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ //| Configurar Línea | //+------------------------------------------------------------------+ void CHistogramLineCorteBase::Set(int x, int y, int width, uint clr, uint clr_clean, bool update = false) { m_x = x; m_y = y; m_size = width; m_clr = clr; m_clr_clean = clr_clean; DrawLine(); if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ //| Clase para Línea Horizontal | //+------------------------------------------------------------------+ class CHistogramLineCorteHor : public CHistogramLineCorteBase { public: CHistogramLineCorteHor(void) {} ~CHistogramLineCorteHor(void) {} __forceinline void DrawLine(void) override; __forceinline void CleanLine() override; void ReSize(int new_size, bool update = false) override; void SetNewValueEjePrincipal(int eje_value, bool clean, bool update = false) override; void SetCordenadas(int x, int y, int width, bool update = false) override; }; //+------------------------------------------------------------------+ //| Dibujar Línea Horizontal | //+------------------------------------------------------------------+ __forceinline void CHistogramLineCorteHor::DrawLine(void) { m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr); } //+------------------------------------------------------------------+ //| Limpiar Línea Horizontal | //+------------------------------------------------------------------+ __forceinline void CHistogramLineCorteHor::CleanLine() { m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr_clean); } //+------------------------------------------------------------------+ //| Redimensionar Línea Horizontal | //+------------------------------------------------------------------+ void CHistogramLineCorteHor::ReSize(int new_size, bool update = false) { m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr_clean); m_size = new_size; m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr); if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ //| Cambiar Valor Eje Principal (Y) Horizontal | //+------------------------------------------------------------------+ void CHistogramLineCorteHor::SetNewValueEjePrincipal(int eje_value, bool clean, bool update = false) { if(clean) m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr_clean); m_y = eje_value; m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr); if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ //| Establecer Coordenadas Horizontal | //+------------------------------------------------------------------+ void CHistogramLineCorteHor::SetCordenadas(int x, int y, int width, bool update = false) { m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr_clean); m_x = x; m_y = y; m_size = width; m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr); if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ //| Clase para Línea Vertical | //+------------------------------------------------------------------+ class CHistogramLineCorteVer : public CHistogramLineCorteBase { public: CHistogramLineCorteVer(void) {} ~CHistogramLineCorteVer(void) {} __forceinline void DrawLine(void) override; __forceinline void CleanLine() override; void ReSize(int new_size, bool update = false) override; void SetNewValueEjePrincipal(int eje_value, bool clean, bool update = false) override; void SetCordenadas(int x, int y, int width, bool update = false) override; }; //+------------------------------------------------------------------+ //| Dibujar Línea Vertical | //+------------------------------------------------------------------+ __forceinline void CHistogramLineCorteVer::DrawLine(void) { m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr); } //+------------------------------------------------------------------+ //| Limpiar Línea Vertical | //+------------------------------------------------------------------+ __forceinline void CHistogramLineCorteVer::CleanLine() { m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr_clean); } //+------------------------------------------------------------------+ //| Redimensionar Línea Vertical | //+------------------------------------------------------------------+ void CHistogramLineCorteVer::ReSize(int new_size, bool update = false) { m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr_clean); m_size = new_size; m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr); if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ //| Cambiar Valor Eje Principal (X) Vertical | //+------------------------------------------------------------------+ void CHistogramLineCorteVer::SetNewValueEjePrincipal(int eje_value, bool clean, bool update = false) { if(clean) m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr_clean); m_x = eje_value; m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr); if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ //| Establecer Coordenadas Vertical | //+------------------------------------------------------------------+ void CHistogramLineCorteVer::SetCordenadas(int x, int y, int width, bool update = false) { m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr_clean); m_x = x; m_y = y; m_size = width; m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr); if(update) m_canvas.Update(); } //+------------------------------------------------------------------+ #endif //+------------------------------------------------------------------+