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"
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.
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.
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.
***
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.
Muchas gracias) Tendré que investigar este tema en algún momento.
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:

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

Figura 2: Anchura de la cabecera después de minimizar/desmoldar
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.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso

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").
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