Discusión sobre el artículo "Cómo crear un panel gráfico de cualquier nivel de complejidad"
Artículo publicado Cómo crear un panel gráfico de cualquier complejidad y cómo funciona:
Autor: Vladimir Karputov
Gracias por el artículo. ¡Muy informativo!
Sí, el artículo es útil, pero no puedo entender cómo manejar el evento ON_DBL_CLICK, ¿puedes ayudar?
Doble clic son dos clics con un intervalo de tiempo muy pequeño entre ellos. Así que puede ser manejado de la misma manera que un clic normal - sólo tiene 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:
//+------------------------------------------------------------------+ //| Función ChartEvent| //+------------------------------------------------------------------+ void OnChartEvent(const int id, // identificador del evento const long& lparam, // parámetro de evento de tipo long const double& dparam, // parámetro de evento de tipo doble 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_CLICK) { uint click_time=GetTickCount(); Print("Las coordenadas del clic del ratón en el gráfico: x = ",lparam," y = ",dparam); if(click_time-last_click<dbl_click_time) { Print("DoubleClick!"); // cualquier otra acción } last_click=click_time; } //--- clic del ratón sobre un objeto gráfico if(id==CHARTEVENT_OBJECT_CLICK) { Print("Pulsando el botón del ratón sobre un objeto llamado '"+sparam+"'"); } //--- pulsar un botón del teclado if(id==CHARTEVENT_KEYDOWN) { switch(lparam) { case KEY_NUMLOCK_LEFT: Print("Se pulsa KEY_NUMLOCK_LEFT".); break; case KEY_LEFT: Print("KEY_LEFT es presionado."); break; case KEY_NUMLOCK_UP: Print("Se ha pulsado KEY_NUMLOCK_UP".); break; case KEY_UP: Print("TECLA_ARRIBA pulsada".); break; case KEY_NUMLOCK_RIGHT: Print("Se pulsa KEY_NUMLOCK_RIGHT".); break; case KEY_RIGHT: Print("KEY_RIGHT"); break; case KEY_NUMLOCK_DOWN: Print("Se pulsa KEY_NUMLOCK_DOWN".); break; case KEY_DOWN: Print("KEY_DOWN es presionado."); break; case KEY_NUMPAD_5: Print("KEY_NUMPAD_5 está pulsada".); break; case KEY_NUMLOCK_5: Print("KEY_NUMLOCK_5 ha sido presionada."); break; default: Print("Se ha pulsado alguna tecla no listada".); } ChartRedraw(); ...... }
- www.mql5.com
Sí, el artículo es útil, pero no puedo entender cómo manejar el evento ON_DBL_CLICK, ¿puedes ayudarme?
Bueno, si intentas hacerlo todo de la forma correcta, es imposible capturar el evento ON_DBL_CLICK. Una prueba sencilla: ejecuto cualquier panel de ejemplo de la sección Paneles y Diálogos, en CWnd::OnMouseUp pongo un breakpoint en:

y como resultado - no importa si haces click o doble click en el panel, el cursor no va al breakpoint. Un fastidio.
Bueno, si intentas hacerlo todo de la forma correcta, es imposible capturar el evento ON_DBL_CLICK. Una simple comprobación: ejecute cualquier panel de ejemplo de la sección Paneles y diálogos, en CWnd::OnMouseUp ponga un breakpoint en:
y como resultado - no importa si haces click o doble click en el panel, el cursor no va al breakpoint. Vaya.
La solución se mostró en otro hilo https://www.mql5.com/ru/forum/239867#comment_7224345.
- 2018.04.23
- www.mql5.com
Nuevo artículo Cómo crear un panel gráfico de cualquier nivel de complejidad ha sido publicado:
Autor: Vladimir Karputov
Este artículo es muy bueno. Me gusta mucho. Muy bien escrito.
Gracias.
Un magnífico artículo para acercarse a este tema o profundizar en él.
Desgraciadamente, esto no cambia el hecho de que falta un editor visual de diálogos en el sistema.
Además, el evento del ratón en los diálogos no se intercepta correctamente y el gráfico se mueve en segundo plano cuando se pulsa el botón del ratón.
Además, los tooltips de los indicadores subyacentes aparecen a través del diálogo.
Esto ocurre a pesar de que el código de Doerk ha sido corregido.
La sustitución de la biblioteca CWndContainer para MetaTrader 5 https://www.mql5.com/es/code/13722
Me pregunto cómo Metaquotes puede ser tan terco como para ignorar esto y no corregirlo.
- votos: 24
- 2016.09.01
- Doerk Hilger
- www.mql5.com
Un magnífico artículo para acercarse a este tema o profundizar en él.
Desgraciadamente, esto no cambia el hecho de que falta un editor visual de diálogos en el sistema.
Además, el evento del ratón en los diálogos no se intercepta correctamente y el gráfico se mueve en segundo plano cuando se pulsa el botón del ratón.
Además, los tooltips de los indicadores que se encuentran detrás atraviesan el diálogo.
Esto ocurre a pesar de que el código de Doerk ha sido corregido.
La sustitución de la biblioteca CWndContainer para MetaTrader 5 https://www.mql5.com/es/code/13722
Me pregunto cómo Metaquotes puede ser tan terco como para ignorar esto y no corregirlo.
Otto entiendo lo que te molesta.
Yo me despedí por demasiados puntos de retoque en la programación gráfica de MT5.
No sé qué concepto persigue MQ ahí, pero creo que van por mal camino.
Hay un marco especial de gráficos integrado en una ventana.
Siempre hablan de seguridad, así que encapsulan todo lo posible.
Basta con proporcionar una API a los datos y dejar que los usuarios decidan qué lenguaje utilizan. Esa sería la forma moderna.
Saludos
- 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 Cómo crear un panel gráfico de cualquier nivel de complejidad:
En el artículo se analiza con detalle cómo crear un panel basado en la clase CAppDialog y cómo añadir al mismo los elementos de control. Asimismo, se describe la estructura del panel y el esquema de herencia de los objetos en este. Se muestra qué es necesario para procesar eventos y cómo estos se distribuyen a los elementos de control subordinados. Se dan ejemplos de cambio de los siguientes parámetros del panel: el tamaño y el color del fondo.
El orden de creación y superposición de objetos de la sección Paneles y diálogos de la Biblioteca estándar tiene el aspecto siguiente. Primero creamos el objeto "Border", dentro de sus límites se añade el fondo del panel en forma de objeto "Back", y en el fondo se superpone el área de cliente "ClientBack", dentro de la cual se pueden encontrar los subcontroles. A la zona superior del panel se añaden el objeto "Caption" con el nombre del panel y dos botones de control.
Autor: Vladimir Karputov