Discusión sobre el artículo "Interfaces gráficas X: Selección del texto en el campo de edición multilínea (build 13)" - página 13

 
Anatoli Kazharski:

Existen más métodos para vincular elementos:

//---

En combinación con estas propiedades, tratar de resolver el problema.


Sí, lo he intentado, pero ya me he roto la cabeza, he entendido que los métodos X(...) e Y(...) vinculan rígidamente los elementos a las coordenadas X e Y y al recibir eventos sobre el cambio de tamaño de la ventana principal del formulario, no reaccionan de ninguna manera a la ubicación de las coordenadas X e Y.
 
Konstantin:

Sí, lo he intentado, pero ya me he roto la cabeza, tenía entendido que los métodos X(...) e Y(...) vinculan rígidamente los elementos a las coordenadas X e Y y al recibir eventos sobre el cambio de tamaño de la ventana del formulario principal, no reaccionan de ninguna manera a la ubicación de las coordenadas X e Y.

¿Puedes mostrar un análogo de lo que necesitas en el ejemplo de alguna aplicación Windows ya hecha? No estoy seguro de entender lo que necesitas. O representarlo gráficamente de alguna manera.

Si he entendido bien, el elemento_2 debe estar ligado al borde inferior del formulario, y el elemento_1 debe ser auto redimensionado verticalmente con una sangría a la altura del elemento_2.

 
Anatoli Kazharski:

¿Puede mostrar un análogo de lo que necesita en el ejemplo de alguna aplicación de Windows ya hecha? No estoy seguro de entender lo que necesitas. O representarlo gráficamente de alguna manera.

Si lo he entendido bien, el elemento_2 debería estar ligado al borde inferior del formulario, y el elemento_1 debería tener un tamaño vertical automático con una sangría a la altura del elemento_2.


Lo has entendido bien, es decir, cuando cambia el tamaño de la ventana, el elemento_1 cambia de tamaño Y, y necesitas que el elemento_2 siga esta reducción, es decir, el escalado normal de los elementos dentro del formulario. Hasta ahora he construido una muletilla que element_1 no se escala )). Trataré este tema más adelante.
 
la biblioteca carece de ajuste de prioridad de visualización, porque los iconos de órdenes/posiciones abiertas tienen mayor prioridad y en consecuencia se colocan encima de todos los elementos gráficos de la biblioteca, creo que se puede realizar al crear objetos gráficos en el "núcleo" de la biblioteca.
 
Konstantin:
la biblioteca carece de prioridades de visualización, porque los iconos de órdenes/posiciones abiertas tienen una prioridad más alta y en consecuencia se colocan en la parte superior de todos los elementos gráficos de la biblioteca, creo que se puede realizar mediante la creación de objetos gráficos en el "núcleo" de la biblioteca.

Inténtalo así:

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading

Discusión del artículo "GUI X: Selección de texto en un campo de entrada multilínea (build 13)".

Anatoli Kazharski, 2017.05.08 21:40

En la clase de aplicación personalizada debes crear un método CProgram::OnTradeEvent().

Y en el archivo principal se debe llamar en la función OnTrade():

//+------------------------------------------------------------------+
//| Función comercial|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   program.OnTradeEvent();
  }

//---

Por ejemplo, tengo este contenido del método CProgram::OnTradeEvent():

//+------------------------------------------------------------------+
//| Evento de transacción comercial|
//+------------------------------------------------------------------+
void CProgram::OnTradeEvent(void)
  {
//--- Envío de un evento a todos los gráficos
   m_events.SendEventToAllCharts(0,ON_TRADE_EVENT,0,0.0,m_program_name);
//--- Establecer las transacciones de la última posición
   if(m_show_deals.CheckButtonState())
      if(m_vdeals.ShowDealsLastPosition())
         ResetWindow();
//--- Comprobación de la distancia de stop loss
   if(m_trailing_stop.CheckButtonState())
      m_ctrade.CheckStopLossSize(::Symbol());
//--- Puesta a cero de variables para operaciones comerciales
   m_ctrade.ZeroCalcPositionVariables();
//--- Inicialización de la matriz de saldo y actualización de las series en el gráfico
   InitBalanceArray();
   m_line_chart.SeriesUpdate(0,m_balance_data,"Balance",clrCornflowerBlue);
  }

 
Anatoli Kazharski:

Pruébalo así:


He visto esto, pero creo que necesitas complementar el uso en el "núcleo" de la librería, es decir, al crear objetos gráficos:

bool  ObjectSetInteger( 
   long                             chart_id,      // identificador del gráfico 
   string                           name,          // nombre 
   ENUM_OBJECT_PROPERTY_INTEGER     prop_id,       // propiedad 
   long                             prop_value     // valor 
   );

propiedad:

OBJPROP_BACK

 
Konstantin:

He visto esto, pero creo que en el "núcleo" de la biblioteca, es decir, al crear objetos gráficos, es necesario complementar el uso:

propiedad:

OBJPROP_BACK

Entonces los gráficos estarán sobre los objetos gráficos de la interfaz.

//---

Haz ResetWindow() por ahora. Intentaré incorporarlo al kernel más adelante para que se actualice automáticamente.

 
Anatoli Kazharski:

A continuación, los gráficos estarán sobre los objetos gráficos de la interfaz.

//---

Haz ResetWindow() por ahora. Intentaré incorporarlo al kernel más adelante para que se actualice automáticamente.


no es exactamente asi, necesitas poner todos los objetos graficos en primer plano, entonces los graficos estaran detras, he implementado esto muchas veces en mi libreria grafica ))
 
Konstantin:

no exactamente, necesitas priorizar todos los objetos gráficos al primer plano, entonces los gráficos estarán detrás, he implementado esto muchas veces en mi librería gráfica ))

No sé qué hiciste y cómo lo hiciste, pero por defecto están en primer plano. Los creados más recientemente están arriba. La única manera de cambiar la prioridad después de la creación es ocultar y mostrar los objetos de nuevo, excepto los que deberían estar en la parte inferior.

 

En el método de la clase CTabs:

void CTabs::CalculatingPatch(int &x,int &y,int &x_size,int &y_size)
  {
   if(ArraySize(m_tabs) == 0)
      return;

   if(m_position_mode==TABS_TOP)
     {
      x      =m_tabs[m_selected_tab].X()+1;
      y      =m_tabs[m_selected_tab].Y2()-1;
      x_size =m_tabs[m_selected_tab].XSize()-2;
      y_size =1;
     }
   else if(m_position_mode==TABS_BOTTOM)
     {
      x      =m_tabs[m_selected_tab].X()+1;
      y      =m_tabs[m_selected_tab].Y();
      x_size =m_tabs[m_selected_tab].XSize()-2;
      y_size =1;
     }
   else if(m_position_mode==TABS_LEFT)
     {
      x      =m_tabs[m_selected_tab].X2()-1;
      y      =m_tabs[m_selected_tab].Y()+1;
      x_size =1;
      y_size =m_tabs[m_selected_tab].YSize()-2;
     }
   else if(m_position_mode==TABS_RIGHT)
     {
      x      =m_tabs[m_selected_tab].X();
      y      =m_tabs[m_selected_tab].Y()+1;
      x_size =1;
      y_size =m_tabs[m_selected_tab].YSize()-2;
     }
  }

se debe añadir resaltado, es una comprobación de matriz nula, porque sin esta comprobación en caso de no haber pestañas, todo el formulario se bloquea con un error.