Librerías: EasyAndFastGUI - librería para crear interfaces gráficas - página 14

 

Hola.

//+------------------------------------------------------------------+
//| Creación de un lienzo para dibujar un elemento |
//+------------------------------------------------------------------+
bool CElement::CreateCanvas(const string name,const int x,const int y,
                            const int x_size,const int y_size,ENUM_COLOR_FORMAT clr_format=COLOR_FORMAT_ARGB_NORMALIZE)
  {
//--- Ajuste de tamaño
   int xsize =(x_size<1)? 50 : x_size;
   int ysize =(y_size<1)? 20 : y_size;
//--- Restablecer último error
   ::ResetLastError();
//--- Creación de un objeto
   if(!m_canvas.CreateBitmapLabel(m_chart_id,m_subwin,name,x,y,xsize,ysize,clr_format))
     {
      ::Print(__FUNCTION__,"No se ha podido crear un lienzo para dibujar el elemento ("")+m_class_name+"): ",::GetLastError());
      return(false);
     }
//--- Restablecer último error
   ::ResetLastError();
//--- Obtener un puntero a la clase base
   if(!m_canvas.Attach(m_chart_id,name,clr_format))
     {
      ::Print(__FUNCTION__,"Error al adjuntar un lienzo de dibujo al gráfico: ",::GetLastError());
      return(false);
     }
//--- Propiedades
   ::ObjectSetString(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TOOLTIP,"\n");
   ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_CORNER,m_corner);
   ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_SELECTABLE,false);
//--- Todos los elementos excepto el formulario tienen mayor prioridad que el elemento principal
   Z_Order((dynamic_cast<CWindow*>(&this)!=NULL)? 0 : m_main.Z_Order()+1);
//--- Coordenadas
   m_canvas.X(x);
   m_canvas.Y(y);
//--- Dimensiones
   m_canvas.XSize(x_size);
   m_canvas.YSize(y_size);
//--- Indents from the end point
   m_canvas.XGap(CalculateXGap(x));
   m_canvas.YGap(CalculateYGap(y));
   return(true);
  }

CreateBitmapLabel - crear un recurso gráfico

Attach - leer el mismo recurso y volver a escribir en el mismo recurso.

¿O he entendido algo mal?

 

Hola de nuevo :)

class CMouse
  {

...............

   //--- (1) Devuelve el número de ventana donde se encuentra el cursor, (2) el tiempo correspondiente a la coordenada X, 
   // (3) nivel (precio) correspondiente a la coordenada Y
   int               SubWindowNumber(void) const { return(m_subwin);                        }
   datetime          Time(void)            const { return(m_time);                          }
   double            Level(void)           const { return(m_level);                         }

¿Se utiliza Tiempo y Nivel en algún sitio? No lo he encontrado...

¿Para qué sirve SubWindowNumber?

Lo que quiero decir es que ChartXYToTimePrice es una operación bastante costosa de realizar en cada movimiento del ratón...

 
Oleksii Chepurnyi:

Está todo en los comentarios. No hay nada que añadir.

 
Anatoli Kazharski:

Está todo en los comentarios. No hay nada que añadir.

Si te refieres a los comentarios en el código, todo está claro allí, pero eso no es lo que las preguntas son :)

 
Oleksii Chepurnyi:

...

Mi punto es que ChartXYToTimePrice es una operación bastante costosa de realizar en cada movimiento del ratón...

Para obtener la coordenada relativa si el GUI no está en la ventana principal.

 
Anatoli Kazharski:

Para obtener la coordenada relativa cuando GUI no está en la ventana principal.

Así que tal vez calcular sólo cuando GUI no está en la ventana principal? :)


Estoy más interesado en ¿por qué Attach? Por lo que entiendo, repite las acciones de CreateBitmapLabel

 
Oleksii Chepurnyi:
Así que tal vez sólo calcular cuando la interfaz gráfica de usuario no está en la ventana principal? :)

También hay variantes cuando la ventana principal GUI está en la subventana del gráfico, y los diálogos están en la ventana principal.

Me interesa más saber por qué Attach? Por lo que entiendo, repite las acciones de CreateBitmapLabel

Hay un código del método CCanvas::Attach():

//+------------------------------------------------------------------+
//| Adjuntar nuevo objeto con recurso bitmap |
//+------------------------------------------------------------------+
bool CCanvas::Attach(const long chart_id,const string objname,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA)
  {
   if(OBJ_BITMAP_LABEL==ObjectGetInteger(chart_id,objname,OBJPROP_TYPE))
     {
      string rcname=ObjectGetString(chart_id,objname,OBJPROP_BMPFILE);
      rcname=StringSubstr(rcname,StringFind(rcname,"::"));
      if(ResourceReadImage(rcname,m_pixels,m_width,m_height))
        {
         m_chart_id=chart_id;
         m_objname=objname;
         m_rcname=rcname;
         m_format=clrfmt;
         m_objtype=OBJ_BITMAP_LABEL;
         //--- éxito
         return(true);
        }
     }
//--- fallido
   return(false);
  }
 
Anatoli Kazharski:


Aquí está el código del método CCanvas::Attach():

Sí, y encima de CreateBitmapLabel. Los he estado mirando. Y por lo que he entendido, CreateBitmapLabel crea un recurso vacío, y Attach lee el recurso (cualquiera) y lo escribe en m_pixels. Y como escribí arriba, creamos un recurso (CreateBitmapLabel) con el nombre name, luego leemos el mismo recurso (Attach) y de nuevo escribimos lo leído en el mismo m_pixels

¿O he entendido algo mal?

PS Experimentalmente sin Attach todo funciona :)

 
Oleksii Chepurnyi:

...

PS Experimentalmente sin Attach todo funciona :)

¿En serio? Así que ha habido algunos cambios de nuevo. Algo no funcionaba antes con seguridad.

¿Y después de borrar GUI del gráfico se borran los objetos?

 
Anatoli Kazharski:

¿De verdad? Así que ha habido otro cambio. Algo definitivamente no estaba funcionando antes.

Y después de quitar la GUI del gráfico, ¿se borran los objetos?

Todo parece estar limpio :)

Archivos adjuntos:
35.png  11 kb
36.png  6 kb