Discusión sobre el artículo "Mejorando el trabajo con Paneles: cómo añadir transparencia, cambiar el color del fondo y heredar a partir de CAppDialog/CWndClient"

 

Artículo publicado Mejorando el trabajo con Paneles: cómo añadir transparencia, cambiar el color del fondo y heredar a partir de CAppDialog/CWndClient:

Vamos a continuar estudiando el funcionamiento de CAppDialog. Ahora vamos a aprender cómo establecer el color de fondo, el borde y el encabezado para un panel gráfico. Veremos paso a paso cómo agregar transparencia a la ventana de la aplicación al desplazar esta por el gráfico. A continuación, analizaremos la creación de descendientes de CAppDialog o CWndClient y veremos nuevos detalles importantes al trabajar con los controles. Finalmente, echaremos un vistazo desde una nueva perspectiva a nuevos proyectos.

Vamos a mostrar en primer lugar qué podemos hacer para el panel basado en la clase CAppDialog (se trata de un ejemplo de funcionamiento del código "Live panel.mq5").

Live panel

Esta animación se muestra que, al desplazar el panel, solo queda el marco exterior del mismo. Durante el desplazamiento, el marco externo también cambiará su color en un orden arbitrario. Cuando se completa el desplazamiento, la forma vuelve a ser normal: aparecen las áreas de trabajo.

Autor: Vladimir Karputov

 

Foro sobre negociación, sistemas automatizados de negociación y prueba de estrategias de negociación

Discusión del artículo "Cómo crear un panel gráfico de cualquier complejidad y cómo funciona"

Rashid Umarov, 2018.04.23 10:30 AM

El doble clic son dos clics con un intervalo de tiempo muy pequeño entre ellos. Por lo tanto, se puede manejar de la misma manera que un clic normal - sólo tienes que añadir una variable estática a OnChartEvent. Mira el ejemplo en https://www.mql5.com/es/docs/constants/chartconstants/enum_chartevents y haz algo como esto:

....

Vamos a mostrar con un ejemplo cómo añadir la gestión del doble clic al panel. Hagamos modificaciones en la clase CMyWndClient



1. Anulemos el método virtual OnDblClick, que proviene del ancestro CWnd.

class CMyWndClient : public CWndClient
  {
private:
   CButton           m_button1;                       // el objeto botón
   CButton           m_button2;                       // el objeto botón
   //--- tamaño de desplazamiento
   int               m_scroll_size;                   // tamaño_desplazamiento
   //--- almacenar el propietario
   CAppDialog        m_owner;                         // propietario
   //--- ocultar lo invisible
   bool              m_hide_invisble;
   //---
   bool              AddButton1(void);
   bool              AddButton2(void);
protected:
   //--- manejadores de los eventos de los controles dependientes
   void              OnClickButton1(void);
   void              OnClickButton2(void);
   void              OnShowScrollH(void);
   virtual bool      OnScrollLineRight(void);
   virtual bool      OnScrollLineLeft(void);
   virtual bool      OnDblClick(void);
.....
//+------------------------------------------------------------------+
//|| anula el manejo del evento OnDblClick ||
//+------------------------------------------------------------------+
bool CMyWndClient::OnDblClick(void)
  {
   Print(__FUNCTION__);
   return ColorBackground(GetRandomColor());
  }

2. Añadir el procesamiento de este evento

//+------------------------------------------------------------------+
//| Manejo de eventos|
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CMyWndClient)
ON_EVENT(ON_CLICK,m_button1,OnClickButton1)
ON_EVENT(ON_CLICK,m_button2,OnClickButton2)
ON_EVENT(ON_DBL_CLICK,this,OnDblClick)
ON_EVENT(ON_SHOW,m_scroll_h,OnShowScrollH)
EVENT_MAP_END(CWndClient)

3. En el fichero de aplicación MyWndClient.mq5, añade líneas para capturar el evento DoubleClick

//+------------------------------------------------------------------+
//| Función de evento de gráfico experto|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // ID del evento 
                  const long& lparam,   // parámetro de evento de tipo long
                  const double& dparam, // parámetro de evento de tipo double
                  const string& sparam) // parámetro de evento de tipo cadena
  {
//--- hora del último clic del ratón
   static uint last_click=0;
//--- clic izquierdo en el gráfico
   if(id==CHARTEVENT_OBJECT_CLICK)   
     {
      uint click_time=GetTickCount();
      //Print("hora_clic=",hora_clic);
      //Print("Coordenadas del clic del ratón en el gráfico: x = ",lparam," y = ",dparam);
      if(click_time-last_click<dbl_click_time)
        {
         PrintFormat("DoubleClick! time=%d msec",click_time-last_click);
         // envía el evento ON_DBL_CLICK al área cliente - deja que lo gestione 
         EventChartCustom(CONTROLS_SELF_MESSAGE,ON_DBL_CLICK,ClientArea.Id(),dparam,ClientArea.Name());       
        }
      last_click=click_time;
      //---
     }
   AppWindow.ChartEvent(id,lparam,dparam,sparam);
  }

4. Añade el tiempo entre clics en milisegundos al parámetro externo de la aplicación - si es menor que el tiempo especificado, se generará el evento DoubleClick.

//+------------------------------------------------------------------+
//|MyWndClient.mq5
//| Copyright 2018, MetaQuotes Software Corp. | |
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.001"
#property description "Aplicación MyWndClient basada en la clase CMyWndClient"
#property description "Añadidos botones para establecer el color de fondo y de la cabecera"
#include "MyWndClient.mqh"
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
//--- parámetro de entrada
input bool InpTwoButtonsVisible=false; // anchura del panel
input bool HideInvisble=false;         // ocultar lo invisible
input uint dbl_click_time=500;         // periodo entre clics en mseg

Se adjuntan los archivos. Puedes verlos individualmente o extraer el archivo a la carpeta MQL5/Experts.

Archivos adjuntos:
 

El vídeo muestra que el evento de doble clic sólo se dispara en el panel. Fuera del panel, el evento no se captura.

Archivos adjuntos:
 
Me pregunto si es posible hacer que el panel sea opaco al ratón. Al arrastrar e incluso editar en el campo Editar, los objetos del gráfico se aferran, deja de arrastrar.
 
Photic:
Me pregunto si es posible hacer que el panel sea opaco al ratón. Cuando se arrastra e incluso editar en el campo Editar, los objetos en el gráfico se aferran, deja de arrastrar.

Además. Muy a menudo las paradas y las tomas se quedan atrapados de esta manera.

Usted puede tratar de resolver esto cambiando su vista a virtual - si las líneas no están seleccionados para la edición, moviendo el panel no se enganchen.

Y también ... sería genial saber cómo mostrar la información actual (por ejemplo, el beneficio en la compra o venta abierta o cualquier información actual cambiante) en la propia ventana del panel?

Tal vez alguien ha hecho algo similar. MT4.

 
Vyacheslav Nekipelov:

***

Y una cosa más ... sería genial saber cómo hacer que la salida de la información actual (por ejemplo, el beneficio en la compra o venta abierta o cualquier información actual cambiante) en la ventana del panel en sí?

Tal vez alguien ha hecho algo similar. MT4.

Usted puede dar salida a cualquier cosa en el panel - sólo tiene que escribir nuevos métodos responsables de la salida.

Pero no es interesante para un terminal antiguo.

Aquí hay un ejemplo de un panel que muestra información sobre las posiciones: https: //www.mql5.com/ru/code/16931.
 
Vladimir Karputov:
Aquí hay un ejemplo de un panel que muestra la información de posición: https: //www.mql5.com/ru/code/16931

Muchas gracias) Tendré que investigar este tema en algún momento.

 
¡Muy buen artículo!
 

Gracias, Vladimir, por este artículo y por el anterior. He aprendido algunos nuevos puntos útiles para mí.

No lograste ver por qué la cabecera se colorea junto con los botones de cierre por primera vez, pero después de minimizar/descolapsar los cambios de color ya no afectan a los controles?


 
Vasiliy Pushkaryov:

Gracias, Vladimir, por este artículo y por el anterior. He aprendido algunos puntos útiles para mí.

No lograste ver por qué la cabecera se colorea junto con los botones de cierre por primera vez, pero después de minimizar/descolapsar los cambios de color ya no afectan a los controles?


He descubierto la razón. Mira la anchura de la cabecera después de la primera ejecución y después de minimizar/desmoldar:

Anchura de la cabecera tras la primera pasada

Fig. 1: Anchura de la cabecera tras el primer lanzamiento


Anchura de la cabecera después de plegarla/desplegarla

Figura 2: Anchura de la cabecera después de minimizar/desmoldar


 
Vladimir Karputov:

He descubierto la causa. Mira el ancho de la cabecera después de la primera ejecución y después de minimizar/desmodificar:


Genial, gracias. He añadido una línea al código y al pulsar el botón ha empezado a colorearse completamente la cabecera.

//+------------------------------------------------------------------+
//| Manejador de eventos|
//+------------------------------------------------------------------+
void CLivePaneButtonClicks::OnClickButton2(void)
  {
   string prefix=Name();
   int total=ExtDialog.ControlsTotal();
   for(int i=0;i<total;i++)
     {
      CWnd*obj=ExtDialog.Control(i);
      string name=obj.Name();
      //---
      if(name==prefix+"Caption")
        {
         CEdit *edit=(CEdit*) obj;
         color clr=(color)GETRGB(XRGB(rand()%255,rand()%255,rand()%255));
         edit.ColorBackground(clr);
         edit.Width(336);
         ChartRedraw();
         return;
        }
     }
  }

Ahora sólo tienes que anular este punto en las funciones

virtual void Minimize(void);
virtual void Maximize(void);

Y todo irá bien.

Pero con su permiso les recordaré un par de veces en las ramas con nuevas builds sobre esta función. A lo mejor lo corrigen.